GO 奇技淫巧
2019-01-18 本文已影响16人
Robin92
执行顺序
import --> const --> var --> init()
image.png
开发速度快
- 编译快,因为只关注被直接引入的库。
- 强类型,省略了许多心力检查类型错误。
并行而非并发
大多数语言线程是并发,即在某一时间段来看,是多个任务一起执行,但在某一时间点,其实只执行了一个。
并行是在同一时间点一同执行的多个任务(利用了多核)。
小细节
-
goroutine
可以充分利用多核 cpu(runtime.GOMAXPROCS(n)
可以设置),是协程,类似线程,但比线程更轻量,占资源更少。像 java 也用了多核,但开启和关闭一个线程开销很大。 - go 使用了组合设计模式,只需简单将一个类型嵌入到另一个类型,就能复用所有功能。
- go 使用了行为建模,意思是实现了这些行为(方法),就是继承了这个接口。
- go 的垃圾回收机制是交给了编译器来做,虽然会有一些额外开销,但降低了开发难度。
-
import _ <package>
引入了包并执行了它的init()
函数。 - go 的找包过程是找 go 的安装目录
/usr/local/go
下和$GOPATH
下找的,所以如果go get
安装不成功,可以按包名与目录名的对应关系将包 copy 到对应目录下。 -
go clean main.go
可以删除go build main.go
生成的 main 可执行文件。 -
go build ./package/path/...
三个点表示匹配所有字符串,即本级目录及以下所有的包。 -
go build .
表示以当前包名作为名称生成当前的可执行文件。 -
go doc [<package>|<builtin directive>]
生成文档 -
godoc -http=:8088
可生成本地所有包的文档,并映射到http
的8088
端口 - 在项目中用
xxx.go
写上包名,相当于一个空文件,可以添加注释用于注释专用文档。 - Golang 中 time.Time 类型的零值对应的时间戳是个负值,表示的是 0001年01月01日;而 mongoDB中 date 的零值对应的时间戳是0,表示的是 1970年01月01日。因此这点要注意引起的 bug。
- Golang 的 cast 包中,string 转换为 int 的方法,会将 “08”开头的字符串当做8进制处理,因而得到结果 0 或对应的8进制数据。
- Golang 的数组是值类型的,而不是指针类型,所以 arr2 = arr1 后,更新 arr1 中的一个元素,arr2对应的元素不改变。PHP 中也是不变的,但 javascript 不一样,js中的 array 是引用类型。
- golang 在 github 上建立了一个镜像库,如 https://github.com/golang/net 即是 https://golang.org/x/net 的镜像库,所以可以在
$GOPATH/src/golang.org/x
下git clone https://github.com/golang/net.git
。其他包一样。