Go语言介绍
Go语言解决现代编程难题
go语言出现的原因
- 编程语言的演化的速度追不上计算机演化的速度; 高性能服务器有越来越多的核心, 我们依旧在使用为单核设计的技术在编程
- 编程技术的演化体现在一个程序或者一个项目是分散且多人合作开发的, Go语言更易分享代码和包
Go语言的特点
- Go的高性能体现在编译时间非常快速, 更加智能的编译器只关注那些直接被引用的库, 不需要像Java、C、C++一样遍历依赖中的所有库
- Go自带强大的标准库
- Go的快速开发体现在语法简介, 关键字数量少易于记忆
- Go内置并发机制, 不用被迫使用特定的线程库, 就能让软件扩展使用更多资源
- Go不用为面向对象付出额外劳动, 使用接口作为代码复用的基础模块
- Go自带垃圾回收机制, 不需要用户管理内存
并发 goroutine
- 并发是go语言最重要的特性
- goroutine是协程, 协程在线程中运行, 占用的内存远远小于线程
- channel是一种内置的数据结构, 可以让goroutine来通信, 发送和接收具有类型的数据
- Go语言是通过通信来共享内存, 而不是通过共享内存来通信
- goroutine
- goroutine是可以和其他goroutine一起并行执行的函数, 主程序main函数也是goroutine
- Go中会只用同一个线程执行多个goroutine
- goroutine使用的内存比线程更少(常常可以启动成千上万个), Go语言在运行时会自动在配置好的一组逻辑处理器上调度执行goroutine
- 每个逻辑处理器会绑定到操作系统的一个线程上
- channel
- 通道是一种内置的数据结构, 可以让goroutine安全的通信并且避免共享内存访问的问题
- 并发中最难的部分就是要确保其他并发运行的线程、进程或者goroutine不会意外修改用户的数据
- 不同线程在没有同步保护的情况下修改同一个数据, 会发生灾难; 在其他语言中, 如果使用全局变量或者共享内存, 必须通过锁规则来防止对同一个变量的不同修改
- 通道保证同一时间只会有一个goroutine修改数据
- 通道不提供跨goroutine的数据访问保护机制, goroutine如果传送的是副本, 每个goroutine对自己的副本修改是安全的; 如果传输的是指针数据, 读和写是由不同goroutine完成的, 每个goroutine需要额外的同步动作
Go语言的类型系统
- Go语言的数据类型是灵活且无继承的
- Go语言使用组合(composition)开设计模式, 只需要将一个类型嵌入到另一个类型, 就能复用所有功能
- Go语言中一个类型由其他更微小的类型组合而成, 避免了传统基于继承模型
- Go语言的接口机制, 允许用户对行为建模, 不需要声明某个类型实现了摸个接口, 会自动判断实例是否符合正在使用的接口
-
类型简单
- 系统自带丰富的类型
- 支持用户自定义类型
-
接口对行为定义类型
- 接口用来描述类型的行为
- 一个类型的实例实现了一个接口的所有方法, 这个类型的实例就可以存储在这个接口的类型中, 不需要额外声明
内存管理
Go有用现代化的垃圾回收机制, Go中内存管理交给编译器做, 虽然有额外开销但是显著降低了开发难度
小结
- Go语言是现代的, 快速的, 带有一个强大的标准库
- Go语言内置对并发的支持
- Go语言使用接口作为代码复用的基础模块