先上代码:
var data *string
p := (*string)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&data))
有两个问题想讨论一下:
- unsafe.Pointer与*unsafe.Pointer可以直接转换么?
答: 可以转换.
根据测试, 结果为:
(unsafe.Pointer) 0xc42000e0a8
(*unsafe.Pointer)(0xc42000e0a8)(0xc4200115f8) // 0xc4200115f8为data实际地址
- 这个操作的目的是原子load一个指针, 在LoadPointer之前, 也就是类型转换的时候, 会不会指针已经发生变化了, 导致原子操作失效.
答: 不会.
类型转换是在编译时候做的, 运行时候不会使指针发生改变.
以上仅为个人理解, 也欢迎大家一起讨论.