🧪
C に void* ってあったから、Golang だとどうなのか?調べてみた
結論
出来る
サンプルコード
package main
import (
"fmt"
"unsafe"
)
type SSS struct {
Pointer interface{}
USafe unsafe.Pointer
}
func main() {
num := 10
sss := "aaaa"
s1 := SSS{
Pointer: &num,
USafe: unsafe.Pointer(&sss),
}
fmt.Printf("%v\n", s1)
fmt.Printf("%d\n", *(s1.Pointer).(*int))
fmt.Printf("%s\n", *(*string)(s1.USafe))
s1.Pointer = &sss
s1.USafe = unsafe.Pointer(&num)
fmt.Printf("%v\n", s1)
fmt.Printf("%s\n", *(s1.Pointer).(*string))
fmt.Printf("%d\n", *(*int)(s1.USafe))
}
実行結果
$ cat /etc/issue
Ubuntu 20.04.1 LTS \n \l
$ go run chk.go
にて実行
{0xc000096010 0xc0000761e0}
10
aaaa
{0xc0000761e0 0xc000096010}
aaaa
10
拡張性を引き換えに、可読性、保守性、事故りそうな事を実装出来そうと思う
Discussion