Skip to content

Commit cd7c179

Browse files
committed
Add unsafes/unsafe_pointer_cast.go
1 parent ae24e0d commit cd7c179

File tree

3 files changed

+53
-5
lines changed

3 files changed

+53
-5
lines changed

examples/basic/unsafes/README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
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パッケージを用いてポインタを任意の型にキャストするサンプルです |

examples/basic/unsafes/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff 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
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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+
}

0 commit comments

Comments
 (0)