How do I convert a variable of type **T
to *unsafe.Pointer
?
The example below will give the compilation error:
cannot convert &ptr (type **s) to type *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))
}
If I switch (*unsafe.Pointer)(&ptr)
to &unsafe.Pointer(ptr)
, I will get this compilation error:
cannot take the address of unsafe.Pointer(ptr)
Ps. I choose to make an example with sync/atomic
because that is one situation where you actually have to do such a conversion.
Edit
One incorrect solution would be to use a temporary variable:
up := unsafe.Pointer(ptr)
atomic.CompareAndSwapPointer(&up, ...
While it compiles, the CAS will only swap what is stored in up
and not in ptr
. This is not the desired result, as zeebo@#go-nuts pointed out.
mcef@#go-nuts posted the answer how to convert **T:
zeebo@#go-nuts provided a working example (posted here with permission):