入口函数main没有参数,且必须放在main包中
字典访问通常采用ok-idiom模式
编辑禁止函数内联
go build -gcflags "-l"
查看汇编go tool objdump -s "main.main" test
4.具有相同签名的函数:(参数和返回值列表相同)清除死代码工具:DCE dead code elimination
-
break continue可以在多层嵌套中指定目标层级
func main(){ outer: for;;{ for;;{ break outer } } }
函数入参都是值拷贝传递
函数参数使用指针不一定比值传递好,被复制的指针会延长咪表对象的生命周期,还可能导致其分配到堆上,增加堆内存分配时间和垃圾回收时间。
-
字符串内部数据结构:
type stringStruct struct{ str unsafe.Pointer len int }
字符串允许以索引号访问字节数组, 但不能获取元素地址
s := "abc"
println(s[1])
println(&s[1]) //错误
go数组是值传递,复制和传参操作都会复制整个数组数据。
切片可以获取元素地址,但不能像数组那样直接用指针访问元素内容
-
方法只要receiver类型正确,使用nil同样可以执行
type N int func (*N) value(){} var p *N p.value() 正确
注意接口返回值
只有当接口的type 与 data都为0时,接口对象才是nil
func main(){
var a interface{} = nil
var b interface{} = (*int)(nil)
println(a == nil, b == nil)
}
输出结果:true false
管道
1) 向已经关闭的通道发送数据panic
2)从已经关闭通道接收数据,返回已缓冲数据或0值-
当管道select有通道关闭,而其他通道正常工作时,处理方式如下:
func main(){ a, b := make(chain int) close(a) for func(){ for { select { case x, ok := <-a : if !ok{ a = nil break } case y, ok := <- b: if !ok{ a = nil break } } } } }
sync Mutex同步锁,将Mutex作为匿名字段时,相关方法必须实现为pointer-receiver,否则会因复制导致锁机制失效。
go所有保存在internal目录下的包仅能被其父目录下的包访问(父、兄访问)
第三方导入,vendor比标准库优先级高
二进制发布时,go build -ldflags "-w -s"会让链接器剔除符号表和调试信息,除能见效可执行文件大小外,还可增加反汇编难度。