Go-Tips

  1. 数组长度是数组类型的一部分,eg:元素类型相同但是长度不同的两个数组不是同类型的。
  2. 切片slice[0:n]共享底层数组,可以使用copy方法避免共享底层数组。
  3. map是一种无序的键值对,它是数据结构hash表的一种实现方式。要求作为key的类型不能是数组、切片、map,其取值必须可以使用 == 判断线程不安全,必要时加锁或者使用sync.Map;使用make函数初始化的时候,可以设置初始容量,如过使用var定义单不赋值,其值为nil且不可直接map[key] = value 进行赋值。
  4. 原始类型的所有操作同样适用于自定义类型,可以使用显示的类型转换进行转换。
  5. 结构体可以内嵌结构体,但是如果是其本身那么只能使用指针
  6. 方法的接受者只能是使用type定义的类型,方法名不能重复,方法名也不能同字段名重复。
  7. defer延迟执行,倒序可能会影响函数最终返回
  8. goroutine:在for循环中注意参数作用域,非缓冲channel程序必须同时存在接收和写入chan的goroutine.单向chan通常作为函数参数。
  9. 切片也是并发不安全的。可考虑加锁,可使用sync.RWMutex来提高读的并发能力。
  10. file.Seek读并发不安全;file.ReadAt并发安全
  11. 追加写入文件的方法:

    1
    2
    3
    4
    func (f *File)Seek(offset int64, whence int)(ret int64, err)
    func (f *File) WreatAt([]byte, off int64)(n int, err)
    // 或以追加的方式打开直接写入
    f, err := os.OpenFile(filename, os.O_WRONLY | os.O_APPEND, 066)
  12. 空结构体,同一字面量,地址相同

    1
    2
    3
    4
    5
       type Conn struct {}
    c := Conn{}
    c1 := Conn{}
    // fmt.Println(&c == &c1) // 单独取消注释:output:false, 两行一起取消注释 output:true
    // fmt.Printf("%p == %p \n", &c, &c1) //output: 0x11a8c30 == 0x11a8c30

True liberty is to have power over oneself in all things.
真正的自由是在所有时候都能控制自己。