Go语言学习笔记,希望雨痕老师早出新版啊,目前看是没有啥迹象了。

雨痕老师确实不错, 听说在知乎等公司都待过.

1.ok-idiom, go里面很多地方都支持这种方式获取是否存在.

2.注意: 局部变量不要覆盖全局。这种很容易隐藏bug.

3.退化赋值,至少有一个是新变量,同时在同一个作用域。写的多了自然明白. 这个叫做退化赋值.

4.预置成员_,不能重新定义。所以能删就要去掉。

5.常量无地址, 所以不要取地址;

6.浮点数默认精度是64。

7.别名无需转换。byte rune, 这个记住了. 我自己定义的type别名可以直接赋值的. 不过ide也会提示. 说强转用不上.

8.new和make的区别。new是初始化指针, 不分配内存. make是要分配内存空间的, 具有cap. 所以两种nil不同. 而且不一定都是堆上海市栈上.

9.相同底层的命名类型不是同一类型,相同底层的非命名类型是同一类型。★ 这句有点绕. 如果命名了, 那么就不是同类, 不能直接赋值. 如果没有, 那么就比较底层的字段是否都是基本类型, 如果是, 那么就是同一个类型, 而数组大小不同不是相同类型, 所以包含数组的类型也不是相同类型.

10.bit clear, 相当于是把每个位都清理掉. z = x &^ y运算相当于先把y取反(针对y的每个bit:0变成1,1变成0),然后再和x进行&运算。

11.指针是变量,地址不是实体。地址的赋值, 地址地址值的赋值, 不是指向内容的.

12.uintptr无法阻止垃圾回收。所以栈上变量取地址并不增加引用计数, 回收之后, 保留的指针将失去意义.

13.空case无法继续。自动break,手动fall through, 则继续执行下一个case;

14.死循环有哪些写法,有几种永久阻塞,可关闭的阻塞。nil chan的读写都会阻塞, select{}, for{}, <-done, wait, lock;

15.for range,变量复用,内存会重新分配吗?复制成本小,无需优化。会发生内存的copy. 地址发生了变化, 那么取的地址就不行了.

16.range目标只执行一次。所以range后面是运算符也可以, 因为不会反复执行. 比如取一个子区间来range;

17.第一类对象, 都可以赋值copy; 也可以直接对比;

18.参数和返回类型相同就是同一个函数类型, 这就是所谓的声明. 对于成员方法来说, 还得带上当前struct的类型作为第一个默认参数的类型, 所以就区分开了.

19.指针导致在堆上分配内存,回收压力大。copy很容易,但是分配堆是很重的操作。

20.闭包代价比较高,高性能不可取。

21.defer是堆栈序。高性能也不可取.

22.循环中打开关闭很多文件,会出问题吗?可能会因为文件没有及时关闭回收, 而导致文件句柄超过限制.

23.扮猪吃老虎。

24.先执行导入包的init,再执行本包的init方法;(知乎);init方法是在同一个goroutine中执行的. 不会并发.

25.RG top的管理者;30+位;

26.[]rune和[]byte数组。都可以用来转换string。rune是符号个数, byte是字节个数.

27.可以不改变类型的情况下转换string和btye。那就是强转了. 这个有点神.

28.zero_garbage,用byte缓冲池。iowriter;

29. ut8.runecountinstring 来记算符号个数,小于len结果。所以遍历的时候要注意.

30.[...]int{1,2} ,len,和cap都只计算第一维长度。这个记住.

31.数组支持==比较!!是值类型,只会拷贝复制。所以要想修改?

32.[]int{5:30}第5个元素是30。支持直接设置某个元素.

33.slice是make的,不支持比较!!!可能在堆上分配。可避免复制开销。

34.reslice,局部对整体的运用,可以实现一个堆栈。不过,是数组都可以呀。底层是同一个数组.

35.超出cap会扩展内存。cap的两倍,如果很大,那么先1/4。★

36.copy函数可以slice或者byte array. 我用的少.

37.协程读写会panic,无法捕获,可以race check. 但是只是在amd64机器上用, 那么如果用intel交叉编译的话, 可以吗?

38.map本身就是指针包装,不用再取地址。

39.不写成员名和用_代替成员名的差别?包含的程度不同.

40.可以比较的类型?struct内都是可以比较的类型时,就可以比较,否则不行。

41.空结构可以作为事件通知。struct{} 不会分配空间. 但是对齐时, 按1计算.

42.未命名类型没有名字标识,无法做为匿名字段。指针类型直接放可以。123页。指针的指针不能做成员.

43.组合之后,可能会重名。无多态,不继承。可以用接口,实现类似继承操作。

44.标签是字段类型的一部分,标准库反射会用到。

45.字段按顺序对齐。且是最长字段。struct空是1长度。内存对齐在cpp里面也有.

46.组合之上,可以覆盖。方法覆盖. 那么组合内部元素的同一个方法就无法直接调用了, 但是可以通过成员调用.

47.nm a.exe | grep main 查找符号表。编译条件可以删掉符号表, 再给出去, 提高反编译难度. 作为自己用来说, 则不用.

48.interface接口变量可能会取地址才能赋值。比较可能会panic,如果遇到类型不支持比较时。

49.map会做并发读写检查,需要同步处理线程安全。

50.数组不会做读写检查,所以可以简单一点。

51.锁成员要用指针,否则会因为变量复制而无法做到资源临界区保护。

52.千万不要两遍锁定,会死锁。不可能连续两次加锁成功。

53.vendor查找优先级比标准库更高。

54.f.Tag.Get(field) 是获取tag的方法. 感觉想Java的注解.

55.Implement ConvertibleTo AssignableTo

56.自举就是用go写go的编译器。在go1.5实现的。

57.GOARCH=amd64 go build -race 用来做race检查。为什么只有这个可以?

58.默认只编译有变化的包。install也默认链接pkg中的静态包。这样快。所以gowatch可以实现3秒钟编译重启,里面还包含了启动的耗时.

59.GOOS=linux go install cmd