GO
离开一门舒服、掌握熟练的语言,去学习一门不仅对自己来说,对整个世界来说都是全新的,是需要勇气的。这是一条人迹罕见,沿途充满了Bug,只有少数先行者熟悉的路。这里充满了意外,文档不明确或者丢失,而且缺少可以拿来即用的代码库。这是拓荒者、先锋者才会选择的道路。 —–《Go in Action》
变量
变量名是以小写开头的,对于小写开头的变量是不公开的。对于大写字母开头是公开的。即小写开头变量仅对包可以见,不能被其他包的中的代码访问。
但是也可以通过一个函数返回不公开的值获取。
Go中,所有变量都默认初始化为零值。数值类型默认为0,字符串类型默认为空字符串,布尔值默认为false,指针默认为nil
创建引用类型需要使用make()来构造,如make(map[string]Matcher),类似于创建Java 中的Map<String,Matcher>
流程控制
range可以迭代数组、字符串、切片、映射和通道。每次迭代会返回元素的索引以及元素值得副本。如果某些变量我们并不需要,可以使用下划线代替将其忽略
闭包
可以在匿名函数里面访问外部变量,一般访问共享变量
函数
自己实现函数,最好保证函数有返回值,并且也有错误返回。如果发生了错误,永远不要使用函数返回的另一个值。尽量遵守这个准则,保证含义足够明确
包管理
每一个.go文件,都应该在第一行声明自己所属的包。每个包都应该在单独一个目录中,不要将多个包放入到同一个目录,也不要将同一个包的文件拆分到多个不同目录中。
同一个目录的下.go文件必须声明同一个包名
给包命名应该使用简洁、清晰且全小写的形式
main包
所以Go语言编译的可执行程序都比如有一个名为main的包。同时当编译器发现包名为main的时候,必须也要有main函数,不然编译器不会创建可执行文件。
编译时,会将main包所在代码所在的目录的目录名作为二进制可执行文件的文件名。
如果不是main包,则编译器认为这就是一个包,而不是命令。
Go中经常使用命令来指代可执行文件。命令时可执行的,而包只是作为予以上的功能单元
关键字
go:启动一个goroutine。如go func(){}
defer:安排随后的函数调用在函数返回时才执行, 如 defer func(){}
命名
当要写的代码属于某个包时,好的实践时使用与代码所在文件夹一样的名字作为包名。
将工厂函数命名为New时Go语言的一个习惯,这个New函数做的事情:它创建一个未公开的类型的值,并把这个值返回给调用者
goroutine和 channal
gouroutine是可以和其他goroutine并行执行的函数,同时也会和主程序并行执行
channal是一种数据结果,能够让goroutine之间进行安全的数据通信