1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-23 20:02:22 +00:00

Fix example convert string ch2-03

This commit is contained in:
Alex Nguyen 2019-06-26 18:42:49 +07:00 committed by GitHub
parent 51e1de4a7c
commit 418c517845
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -322,32 +322,36 @@ type SliceHeader struct {
```go ```go
/* /*
static char arr[10]; #include <string.h>
static char *s = "Hello"; char arr[10];
char *s = "Hello";
*/ */
import "C" import "C"
import ( import (
"reflect" "reflect"
"unsafe" "unsafe"
"fmt"
) )
func main() { func main() {
// 通过 reflect.SliceHeader 转换 // chuyển đổi bằng reflect.SliceHeader
var arr0 []byte var arr0 []byte
var arr0Hdr = (*reflect.SliceHeader)(unsafe.Pointer(&arr0)) var arr0Hdr = (*reflect.SliceHeader)(unsafe.Pointer(&arr0))
arr0Hdr.Data = uintptr(unsafe.Pointer(&C.arr[0])) arr0Hdr.Data = uintptr(unsafe.Pointer(&C.arr[0]))
arr0Hdr.Len = 10 arr0Hdr.Len = 10
arr0Hdr.Cap = 10 arr0Hdr.Cap = 10
// 通过切片语法转换 // chuyển đổi slice
arr1 := (*[31]byte)(unsafe.Pointer(&C.arr[0]))[:10: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)) var s0 string
s1 := string((*[31]byte)(unsafe.Pointer(&C.s[0]))[:sLen:sLen]) 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])
} }
``` ```