github.com/searKing/golang/go@v1.2.74/unsafe/translator.go (about) 1 // Copyright 2020 The searKing Author. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package unsafe 6 7 // #include <stdlib.h> 8 //enum { 9 // sizeofPtr = sizeof(void*), 10 //}; 11 import "C" 12 import ( 13 "reflect" 14 "unsafe" 15 ) 16 17 // CStringArray You can write as this directly. 18 // // []string -> [](*C.char) 19 // var strs []string 20 // cCharArray := make([]*C.char, 0, len(strs)) 21 // for _, s := range strs { 22 // char := (*C.char)(unsafe.Pointer(C.CString(s))) 23 // cCharArray = append(cCharArray, char) 24 // defer C.free(unsafe.Pointer(char)) //ιζΎε ε 25 // } 26 // var cstr **C.char 27 // var cstrSize C.int 28 // cstr = (**C.char)(unsafe.Pointer(&cCharArray[0])) 29 // cstrSize = C.int(len(strs)) 30 func CStringArray(strs ...string) (**C.char, C.int) { 31 // []string -> [](*C.char) 32 totalLen := len(strs) * C.sizeofPtr 33 for _, s := range strs { 34 totalLen += len(s) 35 } 36 cCharArrayBuf := C.malloc(C.size_t(totalLen)) 37 cCharArray := make([]*C.char, 0, len(strs)) 38 for _, s := range strs { 39 cCharArray = append(cCharArray, (*C.char)(unsafe.Pointer(C.CString(s)))) 40 } 41 //return (**C.char)(unsafe.Pointer(&cCharArray[0])), C.int(len(strs)) 42 return (**C.char)(unsafe.Pointer(cCharArrayBuf)), C.int(len(strs)) 43 } 44 45 // GoStringArray char** -> []string 46 func GoStringArray(strArray unsafe.Pointer, n int) []string { 47 // char** -> [](C.*char) 48 cCharArray := make([]*C.char, n) 49 header := (*reflect.SliceHeader)(unsafe.Pointer(&cCharArray)) 50 header.Cap = n 51 header.Len = n 52 header.Data = uintptr(strArray) 53 54 // [](C.*char) -> []string 55 strs := make([]string, 0, n) 56 for _, s := range cCharArray { 57 strs = append(strs, C.GoString(s)) 58 } 59 return strs 60 } 61 62 //// []unsafe.Pointer -> ** unsafe.Pointer 63 //func CPointerArray(strs []unsafe.Pointer) (*unsafe.Pointer, C.int) { 64 // return (*unsafe.Pointer)(unsafe.Pointer(&strs[0])), C.int(len(strs)) 65 //} 66 // 67 //// char** -> []interface{} 68 //func GoPointerArray(pointerArray *unsafe.Pointer, n int) []unsafe.Pointer { 69 // cPointerArray := make([]unsafe.Pointer, n) 70 // header := (*reflect.SliceHeader)(unsafe.Pointer(&cPointerArray)) 71 // header.Cap = n 72 // header.Len = n 73 // header.Data = uintptr(unsafe.Pointer(pointerArray)) 74 // return cPointerArray 75 //} 76 // 77 //func CAnyArray(strs []interface{}) (*unsafe.Pointer, C.int) { 78 // return (*unsafe.Pointer)(unsafe.Pointer(&strs[0])), C.int(len(strs)) 79 //} 80 // 81 //// char** -> []interface{} 82 //func GoAnyArray(anyArray *unsafe.Pointer, n int) []interface{} { 83 // cAnyArray := make([]interface{}, n) 84 // header := (*reflect.SliceHeader)(unsafe.Pointer(&cAnyArray)) 85 // header.Cap = n 86 // header.Len = n 87 // header.Data = uintptr(unsafe.Pointer(anyArray)) 88 // return cAnyArray 89 //}