File tree Expand file tree Collapse file tree 3 files changed +53
-5
lines changed
Expand file tree Collapse file tree 3 files changed +53
-5
lines changed Original file line number Diff line number Diff line change 22
33このディレクトリには以下のサンプルがあります。
44
5- | file | example name | note |
6- | -------------------- | ----------------- | --------------------------------------- |
7- | unsafe_sizeof.go | unsafe_sizeof | unsafe.Sizeof() についてのサンプルです. |
8- | unsafe_string.go | unsafe_string | unsafe.String() のサンプルです. |
9- | unsafe_stringdata.go | unsafe_stringdata | unsafe.StringData() のサンプルです. |
5+ | file | example name | note |
6+ | ---------------------- | ------------------- | -------------------------------------------------------------------- |
7+ | unsafe_sizeof.go | unsafe_sizeof | unsafe.Sizeof() についてのサンプルです. |
8+ | unsafe_string.go | unsafe_string | unsafe.String() のサンプルです. |
9+ | unsafe_stringdata.go | unsafe_stringdata | unsafe.StringData() のサンプルです. |
10+ | unsafe_pointer_cast.go | unsafe_pointer_cast | unsafeパッケージを用いてポインタを任意の型にキャストするサンプルです |
Original file line number Diff line number Diff line change @@ -16,4 +16,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
1616 m ["unsafe_sizeof" ] = Sizeof
1717 m ["unsafe_string" ] = UnsafeString
1818 m ["unsafe_stringdata" ] = UnsafeStringData
19+ m ["unsafe_pointer_cast" ] = PointerCast
1920}
Original file line number Diff line number Diff line change 1+ package unsafes
2+
3+ import (
4+ "fmt"
5+ "unsafe"
6+ )
7+
8+ // PointerCast は、unsafeパッケージを用いてポインタを任意の型にキャストするサンプルです。
9+ //
10+ // unsafe.Pointer は、C言語でいう (void *) と同じものとなる。
11+ // C言語において、(void *) は何にでも成れるのと同様に unsafe.Pointer はGoでもどの型にもキャスト出来る。
12+ // ただし、unsafeパッケージを利用する時点でGoの持つ安全性を無くすことに注意が必要。
13+ //
14+ // REFERENCES:
15+ // - https://pkg.go.dev/unsafe@go1.25.3#Pointer
16+ func PointerCast () error {
17+ var (
18+ value int = 0x01020304
19+ ptr unsafe.Pointer
20+ cast1 * byte
21+ cast2 * [4 ]byte
22+ )
23+ // 元の値をunsafe.Pointerにする
24+ ptr = unsafe .Pointer (& value )
25+
26+ // C言語でいう (char *)ptr; のような変換
27+ cast1 = (* byte )(ptr )
28+
29+ // 明示的な配列のポインタへの変換
30+ cast2 = (* [4 ]byte )(ptr )
31+
32+ // 値を確認 (cast1)
33+ // *cast1 は最初の1バイトのみを参照する (リトルエンディアン環境では 0x04)
34+ // 後続バイトにアクセスするには unsafe.Add() または uintptrを使ったポインタ演算 などを使用する必要がある
35+ fmt .Printf ("cast1: 1バイト目: 0x%02X\n " , * cast1 )
36+ fmt .Println ("---------------------------------" )
37+
38+ // 値を確認 (cast2)
39+ // *[4]byte 型なので配列として全4バイトに直接アクセス可能
40+ // メモリレイアウトはエンディアンに依存する(リトルエンディアンでは逆順)
41+ for i , v := range cast2 {
42+ fmt .Printf ("cast2: %dバイト目: 0x%02X\n " , i , v )
43+ }
44+
45+ return nil
46+ }
You can’t perform that action at this time.
0 commit comments