如何开始学习一门语言,以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 协议 ,转载请注明出处!