タイプの変数を に変換するにはどうすればよい**T
です*unsafe.Pointer
か?
以下の例では、コンパイル エラーが発生します。
&ptr (タイプ **s) をタイプ *unsafe.Pointer に変換できません
package main
import (
"sync/atomic"
"unsafe"
)
type s struct {
value int
}
func main(){
var ptr *s
a := &s{42}
old := ptr
atomic.CompareAndSwapPointer(
(*unsafe.Pointer)(&ptr), // &unsafe.Pointer(ptr)
unsafe.Pointer(old),
unsafe.Pointer(a))
}
に切り替える(*unsafe.Pointer)(&ptr)
と&unsafe.Pointer(ptr)
、次のコンパイル エラーが発生します。
unsafe.Pointer(ptr) のアドレスを取得できません
Ps。sync/atomic
実際にそのような変換を行う必要がある状況の 1 つであるため、例を作成することにしました。
編集
間違った解決策の 1 つは、一時変数を使用することです。
up := unsafe.Pointer(ptr)
atomic.CompareAndSwapPointer(&up, ...
コンパイル中、CAS は に格納されているものだけを交換し、 に格納されup
ていないものを交換しptr
ます。zeebo@#go-nuts が指摘したように、これは望ましい結果ではありません。