先上代碼:
var data *string
p := (*string)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&data))
有兩個(gè)問(wèn)題想討論一下:
- unsafe.Pointer與*unsafe.Pointer可以直接轉(zhuǎn)換么?
答: 可以轉(zhuǎn)換.
根據(jù)測(cè)試, 結(jié)果為:
(unsafe.Pointer) 0xc42000e0a8
(*unsafe.Pointer)(0xc42000e0a8)(0xc4200115f8) // 0xc4200115f8為data實(shí)際地址
- 這個(gè)操作的目的是原子load一個(gè)指針, 在LoadPointer之前, 也就是類(lèi)型轉(zhuǎn)換的時(shí)候, 會(huì)不會(huì)指針已經(jīng)發(fā)生變化了, 導(dǎo)致原子操作失效.
答: 不會(huì).
類(lèi)型轉(zhuǎn)換是在編譯時(shí)候做的, 運(yùn)行時(shí)候不會(huì)使指針發(fā)生改變.
以上僅為個(gè)人理解, 也歡迎大家一起討論.