如何开始学习一门语言,以GoLang为例

如何开始学习一门语言,以GoLang为例

语言层面

在语言层面上,学习新语言的最佳方式是对照一门熟悉的语言,进行比较学习。

基础特性

基础特性 GO Java
关键字 go,type,const等 new,public,final等
流程控制 for-range,select,defer while/do-while,for-each,try-catch
类型 静态类型(支持运行时动态),强类型
:=,make,var初始化类型
静态类型(支持运行时动态),强类型
new初始化类型
面向对象 非面向对象,通过结构体的组合嵌套实现”继承“,但只能继承属性 原生支持面向对象的继承、多态、封装
函数 函数也是一种类型,可独立依附在包中也可以通过接收器依附在结构体上
支持多值返回,有匿名返回值和命名返回值
只能在类中声明
实现接口 鸭子类型 implements
多态 只能通过实现接口来实现多态,仅靠结构体的组合嵌套是无法让两者有任何子父关系的 extends,implements实现多态

进阶特性

进阶特性 GO Java
泛型 (v1.18)支持,但泛型范围需提前约束,如`function[T int string](t T){..}`
反射 TypeOf(),ValueOf() Class<?>,类加载器
异常 error,panic
实现error接口即可实现自定义异常
Exception,RuntimeException
继承Exception,RuntimeException实现自定义异常

异常处理

异常处理也是一门语言必备特性,需要关注于如何抛出异常,如何创建异常,如何捕获异常,能否全局捕获异常

异常处理 Go Java
创建异常 errors.New(),fmt.Errorf() new Exception()
抛出异常 将error作为函数返回值返回 throw显式抛出异常,且函数带有throws
捕获异常 通过iferr捕获error try-catch捕获
能否全局捕获异常 对于panic可以通过recover捕获 Spring提供@ControllerAdvice, AOP也能实现全局捕获

并发支持

需要关注于如何开始并发, 线程通信,如何解决并发竞争,并发效率如何,如何控制并发,能否资源重用

并发支持 Go Java
开启并发 通过go启动协程 Thread,Runnable,Callable; 线程池
通信 channel,semaphore,Context volatile,ThreadLocal,
并发竞争 mutex锁, channel CAS, synchronize, lock
并发控制 WaitGroup, park/unpark 线程池, wait/notify/join
资源重用 Pool池化技术 线程池,对象池
线程/协程模型 GMP 内核线程模型

编译

关注编程语言的编译模式,能了解其平台兼容性如何、也能通过反编译了解代码运行细节。主要关注于语言编译模式、运行模式、交叉编译

编译 GO Java
编译模式 编译成可执行文件
go build
编译成中间字节码
javac
运行模式 直接运行 通过JVM的解释器运行
交叉编译 不同平台需要编译出不同的编译产物
CGO_ENABLE=0 GOOS=linux GOARCH=amd64 go build
不同平台需要安装不同JVM,编译产物本身无视平台差异
编译流程 源码-语法分析/AST-类型检查(改写内建函数等)-中间代码生成-机器码生成 源码-语法分析/AST-填充符号表-注解处理-字节码

IO

关注IO模型,了解语言在CPU密集型程序或IO密集型程序上的优劣。主要关注于文件IO、网络IO、IO的实践方式、IO的同异步

IO Go Java
IO实践 文件IO、网络IO、缓冲IO等,它们都衍生自io包 BIO(IO流)、NIO(通道)
IO的同异步 网络IO为异步,但文件IO是同步 BIO为同步阻塞、NIO为同步非阻塞
文件IO bufio、os、strings、bytes等方法包 字节流、字符流
网络IO net包、Gin框架 Netty框架

内存模型

关注内存模型,可以了解语言的GC策略,以避免烂代码。主要关注于内存管理模型、GC策略

内存模型 Go Java
内存管理 spans、bitmap、arena 方法区、堆、线程私有栈
内存分配 内存分配器(mcache、mcentral、mheap) JMM
垃圾扫描 三色标记法+混合写屏障 分代收集算法、标记清除算法、标记整理算法、复制算法
GC策略 堆内存GC、定时GC、手动GC Serial Old收集器、G1收集器等

应用程序

了解语言如何搭建一个应用程序,如何提供服务。主要关注于应用启动流程、Web应用框架,脚本编程

应用程序 Go Java
Web应用框架 Gin、net/http包 SpringBoot
应用启动流程 监听端口,绑定路由 设置端口,添加过滤器,添加控制层
脚本编程 flag包、go build为可执行文件 \

最佳实践

规范编程习惯,写出简洁清晰的代码。主要关注目录规范、代码规范、优秀脚手架

最佳实践 Go Java
脚手架 Gin、gorm、zaplog等 Netty、Spring、JPA、mybatis
代码规范 Effective Go、Uber Go 阿里巴巴Java开发手册
目录规范 Standard Go Project Layout MVC模式、DDD模式

应用领域

综上能基本了解一门语言的优劣,进而了解其合适的应用场景

实用场景 Go Java
场景类型 高并发,分布式
业务倾向 云计算、中间件、区块链 嵌入式、软件应用、大数据
知名方案 K8s,Docker,etcd,tidb Spring,matlab,

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!