golang Tips之原子切换指针

先上代码:

var data *string
p := (*string)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&data))

有两个问题想讨论一下:

  1. unsafe.Pointer与*unsafe.Pointer可以直接转换么?
    答: 可以转换.
    根据测试, 结果为:
(unsafe.Pointer) 0xc42000e0a8
(*unsafe.Pointer)(0xc42000e0a8)(0xc4200115f8) // 0xc4200115f8为data实际地址
  1. 这个操作的目的是原子load一个指针, 在LoadPointer之前, 也就是类型转换的时候, 会不会指针已经发生变化了, 导致原子操作失效.
    答: 不会.
    类型转换是在编译时候做的, 运行时候不会使指针发生改变.

以上仅为个人理解, 也欢迎大家一起讨论.

你可能感兴趣的:(golang Tips之原子切换指针)