golang圣经学习
一、入门
1. ++、--皆为语句,非表达式,因此y=x++非法;且++、--只能放在后面,因此--x非法
2. 变量声明方式:
—— 第一种为短变量声明,只能用在函数内部,而不能用于包变量
3. 函数和包级别的变量可以以任意顺序声明,并不影响其被调用。
4. Go里无指针运算,即无法对指针进行加或减操作。
二、程序结构
1. Go语言风格中,尽量使用短小的名字,对于局部变量尤其如此:如i之类的短名字,而不是theLoopIndex之类冗长的命名。 通常而言,若一个名字的作用域比较长,生命周期也比较长,那么用长的名字会更有意义。
2. Go中主要有四种类型的声明语句:变量、常量、类型、函数
3. Go中的引用类型:slice、map、chan、函数
4. 聚合类型:数组、struct等
5. 在包级别声明的变量,将会在main入口函数执行前初始化
6. ":=" ---- 简短变量声明语句
简短变量声明语句只有对已经在同级词法域声明过的变量才和赋值操作语句等价,如果变量
是在外部词法域声明的,那么简短变量声明语句将会在当前词法域重新声明一个新的变量。
我们在本章后面将会看到类似的例
7. 变量,有时被称为,可寻址的值
8. 返回函数中局部变量的地址也是安全的
9. Go垃圾回收器:需要知道变量的全部别名(如*p)
10. 变量的生命周期:
编译器会自动选择在栈上还是在堆上分配局部变量的存储空间,该行为受到以下的影响:
如果将指向短生命周期对象的指针保存到具有长生命周期的对象中,
特别是保存到全局变量时,会阻止对短生命周期对象的垃圾回收
var global *int func f() { var x int x = 1 global = &x }
func g() { y := new(int) *y = 1 } f函数里的x变量必须在堆上分配,因为它在函数退出后依然可以通过包一级的global变量找 到,虽然它是在函数内部定义的;用Go语言的术语说,这个x局部变量从函数f中逃逸了。相 反,当g函数返回时,变量 *y 将是不可达的,也就是说可以马上被回收的。因此, *y 并没 有从函数g中逃逸,编译器可以选择在栈上分配 *y 的存储空间(译注:也可以选择在堆上分 配,然后由Go语言的GC回收这个变量的内存空间)
11. 自增、自减是语句,new是函数
12. 作用域、生命周期:
不要将作用域和生命周期混为一谈。声明语句的作用域对应的是一个源代码的文本区域;它
是一个编译时的属性。一个变量的生命周期是指程序运行时变量存在的有效时间段,在此时
间区域内它可以被程序的其他部分引用;是一个运行时的概念。
13. 可以通过“_, ok”来map查找、类型断言、通道接收
14. 将一个字符串转为 []byte 类型的slice将拷贝一个字符串数据的副本
15. 包的初始化:
1. 包级变量根据依赖关系进行顺序初始化;
2. 对于多个.go源文件,将按照发给编译器的顺序进行初始化,GO语言的构建工具根据文件名排序,再一次调用编译器编译;
3. 对于没初始化表达式的变量,可以用init函数初始化;
4. 包的初始化是自下而上进行的,main包最后被初始化
16.
var cwd string func init() { cwd, err := os.Getwd() // compile error: unused: cwd if err != nil { log.Fatalf("os.Getwd failed: %v", err) } } 虽然cwd在外部已经声明过,但是 := 语句还是将cwd和err重新声明为新的局部变量。因为内 部声明的cwd将屏蔽外部的声明,因此上面的代码并不会正确更新包级声明的cwd变量。
函数内的for循环也是。
--- to know ---
1. 语法糖
--- to do ---
1. 用ssh配置secure shell,将key保存在server和本地,一键登录server:
预置:本地使用ssh-keygen.exe生成id_rsa.pub、id_rsa等文件。
动作:将生成的id_rsa.pub的内容,保存到server用户目录下的.ssh/authorized_keys文件下(如/root/.ssh/authorized_keys),再配置chrome secure shell,将id_rsa和id_rsa.pub导入:
保存即可。
2. https ca问题:
https://superuser.com/questions/437330/how-do-you-add-a-certificate-authority-ca-to-ubuntu?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
3. git RPC failed问题:
https://stackoverflow.com/questions/25442734/git-clone-error-rpc-failed-result-56-http-code-200