advanced-go-programming-book icon indicating copy to clipboard operation
advanced-go-programming-book copied to clipboard

2.3.4 有疑问

Open icaiyu opened this issue 6 years ago • 1 comments

/*
#include <string.h>
char arr[10];
char *s = "Hello";
*/
import "C"
import (
    "reflect"
    "unsafe"
)
func main() {
    // 通过 reflect.SliceHeader 转换
    var arr0 []byte
    var arr0Hdr = (*reflect.SliceHeader)(unsafe.Pointer(&arr0))
    arr0Hdr.Data = uintptr(unsafe.Pointer(&C.arr[0]))
    arr0Hdr.Len = 10
    arr0Hdr.Cap = 10

    // 通过切片语法转换
    arr1 := (*[31]byte)(unsafe.Pointer(&C.arr[0]))[:10:10]

    var s0 string
    var s0Hdr = (*reflect.StringHeader)(unsafe.Pointer(&s0))
    s0Hdr.Data = uintptr(unsafe.Pointer(C.s))
    s0Hdr.Len = int(C.strlen(C.s))

    sLen := int(C.strlen(C.s))
        s1 := string((*[31]byte)(unsafe.Pointer(C.s))[:sLen:sLen])
}

其中的arr1 := (*[31]byte)(unsafe.Pointer(&C.arr[0]))[:10:10] 这里的数字31有点莫名奇妙啊,是不是应该是10啊

icaiyu avatar Jul 27 '19 14:07 icaiyu

错误,应该是1<<31,就是临时定义一个比较大的数组(要打印len就行),这样对数组再做切片

chai2010 avatar Aug 10 '19 08:08 chai2010