疑问
sync.Mutex避免复制
1 | 避免结构体中存在sync.Mutex,使用值方法 |
数据竞争
1 | 如何查看数据竞争 |
指针安全
1 | var pT atomic.Pointer[T] |
sync.Cond协程之间的通知
1 | cond := sync.NewCond(&sync.Mutex{}) |
读写锁的顺序
1 | 读锁可以在其他读锁获取的时候同时获取,存在其他读锁则会阻塞 |
恐慌恢复
1 | defer func() { |
延迟调用
1 | defer t.M(1).M(2).M(5).M(6) 会先调用M(1),M(2),M(5),再调用defer M(6) |
反射
1 | 获取指针的基类型 |
指针重新赋值
1 | 指针重新赋值会导致指针指向的内存地址发生变化 |
看不懂的语法糖
1 | 遍历函数特性 go 1.23版本 |
动态类型接口值比较
1 | 接口包含动态类型和动态变量,必须两者都相等才相等 |
断言
1 | 接口类型才有断言,可以用来判断值的类型 |
接口类型
1 | 一个接口的方法完全包含另一个接口,接可以转化成另一个接口 |
运算分析
1 | const s = "Go101.org" |
循环
1 | 循环中直接修改value不会影响到映射的数据 |
不可寻址
1 | 可以使用&获取内存地址 |
切片数组映射
1 | 结构体struct可以作为映射map的下标key,可以用来表示多对一的查询 |
类型转换
1 | 指针类型的转换要把指针类型用()括起来,例如(*int64)() |
计算
1 | 不同的数据类型变量不能运算操作 |
变量作用域
1 | 内部声明的同名变量会在内部起作用,不会影响到外部同名的变量的值 |
类型转换
1 | 常量转换溢出报错 |
赋值
1 | :=的规则是至少有一个新的变量,_不是新的变量 |
一个死循环
1 | type I interface { |