🧪

C に void* ってあったから、Golang だとどうなのか?調べてみた

2020/10/07に公開

結論

出来る

サンプルコード

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

拡張性を引き換えに、可読性、保守性、事故りそうな事を実装出来そうと思う

参考

Unsafe in Go 甘美な世界

Discussion