1.1 特征
语法简单
并发模型
- 一切并发化,运行时用Goroutine运行所有,包括main入口函数
- 无需处理回调
内存分配
- tcmalloc--为并发而设计的高性能内存分配组件
垃圾回收
能用
静态链接
标准库
- net/http
- ...
工具链
- 内置完整测试框架
- 用于调优的pprof
1.2 简介
源文件
- 使用UTF-8编码,对Unicode支持良好
utf-8是unicode的一套实现。unicode给所有语言、文字和符号定义了一个编码,utf-8提供了这个编码和实际文本的映射,保证在不同计算机中使用相同的符号可以表示相同的文本,展示相同的含义。
- 文件头部用package声明所属包名称
- 以“.go”作为文件扩展名,语句结束分号会被默认省略
- 支持C样式注释
- 入口函数main没有参数,且必须放在main包中
- 用import导入标准库或第三方包
未使用的导入,编译器会报错
变量
- 使用var定义变量,支持类型推断
- 编译器确保变量总是被初始化为零值
- 函数内部可以使用
x := 100的方式定义变量
package main
func main(){
var x int32
y := 100
x,y := 100,100 //错误,已经定义过
x,z := 100,100 //只要有没有定义过的变量即可
}
表达式
- if
- switch
- for
- for...range
函数
- 函数可以定义多个返回值,甚至对其命名(命名后相当于已经被定义)
- 函数是第一类型,可作为参数或返回值
- 用defer定义延迟调用,无论函数是否出错,它都确保结束前被调用
数据
- 切片(slice)可以实现类似动态数组的功能
- 可以将map内置,直接从运行时层面获得性能优化
- 结构体可匿名嵌入其他类型
方法
- 可以为当前包内的任意类型定义方法
- 可以直接调用匿名字段的方法,这种方式可实现与继承类似的功能
接口
接口采用了duck type方式,无须在实现类型上添加显式声明
并发
- 整个运行时完全并发化设计
- channel与goroutine搭配,实现用通信代替内存共享的CSP模型