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