1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| package main
import ( "fmt" "unsafe" )
type slice struct { array unsafe.Pointer len int cap int }
type stringStruct struct { str unsafe.Pointer len int }
func main() { str := "hello" strStruct := (*stringStruct)(unsafe.Pointer(&str)) for i := 0; i < strStruct.len; i++ { fmt.Printf("%c ", *(*byte)(unsafe.Pointer(uintptr(strStruct.str) + uintptr(i)*unsafe.Sizeof(byte(0))))) } fmt.Printf("\n-----------------\n")
bytes := []byte("Hello, 世界") bytesSlice := (*slice)(unsafe.Pointer(&bytes)) for i := 0; i < bytesSlice.len; i++ { fmt.Printf("%d ", *(*byte)(unsafe.Pointer(uintptr(bytesSlice.array) + uintptr(i)*unsafe.Sizeof(byte(0))))) } fmt.Printf("\n-----------------\n")
int8s := []int8{0, 9, 8, 7, 6, 90, 89, 87} int8sSlice := (*slice)(unsafe.Pointer(&int8s)) for i := 0; i < int8sSlice.len; i++ { fmt.Printf("%d ", *(*int8)(unsafe.Pointer(uintptr(int8sSlice.array) + uintptr(i)*unsafe.Sizeof(int8(0))))) } fmt.Printf("\n-----------------\n")
int16s := []int16{0, 9, 8, 7, 6, 90, 89, 87, 800} int16Slice := (*slice)(unsafe.Pointer(&int16s)) for i := 0; i < int16Slice.len; i++ { fmt.Printf("%d ", *(*int16)(unsafe.Pointer(uintptr(int16Slice.array) + uintptr(i)*unsafe.Sizeof(int16(0))))) } fmt.Printf("\n-----------------\n")
strings := []string{"hello", "世界", "golang"} stringsSlice := (*slice)(unsafe.Pointer(&strings)) for i := 0; i < stringsSlice.len; i++ { fmt.Printf("%s ", *(*string)(unsafe.Pointer(uintptr(stringsSlice.array) + uintptr(i)*unsafe.Sizeof(string(""))))) } fmt.Printf("\n-----------------\n") }
|