go 常见坑

数组和切片的区别

容量是否可伸缩
是否可以进行比较

UTF-8, unicode

unicode 是一种字符集(code point)
utf-8 是 unicode 的存储实现(转换为字节序列的规则)

字符“中”
Unicode0x4E2D
UTF-80xE4B8AD
string/[]byte[0xE4,0xB8,0xAD]

按位清零 &^

LSP

接口使用原则

只依赖功能最小的接口

panic vs os.Exit

os.Exit 退出时不会调用 defer 指定的函数
os.Exit 退出时不输出当前调用栈信息

package

注意代码在 github 上的组织形式,以适应 go get。直接以代码路径开始,不要有 src

Thread vs Groutine

  • 创建是默认的 stack 大小
    JDK1.5 以后 java Thread stack 默认为 1M
    Groutine 的 stack 初始化大小为2k

  • 和 KSE (Kernel Space Entity)的对应关系
    Java Thread 是 1:1
    Groutine 是 M:N

image.png
image.png

行为方法定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type Employee struct {
Id string
Name string
Age int
}

// 第一种定义方式在实例对应的方法被调用时, 实例的成员会进行值复制
func (e Employee) String() string {
return fmt.Sprintf("ID:%s-Name%s-Age:%d", e.Id, e.Name, e.Age)
}

// 通常情况下为了避免内存拷贝我们使用第二种定义方式
func (e *Employee) String() string {
return fmt.Sprintf("ID:%s/Name%s/Age:%d", e.Id, e.Name, e.Age)
}

channel 的关闭

  • 向关闭的 channel 发送数据,会导致 panic
  • v,ok<-channel 为 bool 值, true 表示正常接受, false 表示通道关闭
  • 所有的channel 接收者都会在 channel 关闭时, 立刻从阻塞等待中返回且上述 ok 值为 false。这个广播机制常被利用,进行向多个订阅者同时发出信号。如:退出信号。