这必须手动完成。您必须分配一个新**C.char
类型并遍历[][]byte
切片中的每个元素以将其分配给新列表。**C.char
这涉及为每次迭代将指针偏移正确的大小。
这是一个执行此操作的示例程序。
正如下面的评论所暗示的,如果您打算char *
使用类似 C 的东西打印列表printf
,请确保输入字符串以 NULL 结尾。理想情况下,通过使用C.CString()
函数转换它们。这假设它们将被视为字符串。否则,您可能还需要提供一种将每个单独char *
列表的长度传递给 C 函数的方法。
package main
/*
#include <stdlib.h>
#include <stdio.h>
void test(char **list, size_t len)
{
size_t i;
for (i = 0; i < len; i++) {
//printf("%ld: %s\n", i, list[i]);
}
}
*/
import "C"
import "unsafe"
func main() {
list := [][]byte{
[]byte("foo"),
[]byte("bar"),
[]byte("baz"),
}
test(list)
}
func test(list [][]byte) {
// Determine the size of a pointer on the current system.
var b *C.char
ptrSize := unsafe.Sizeof(b)
// Allocate the char** list.
ptr := C.malloc(C.size_t(len(list)) * C.size_t(ptrSize))
defer C.free(ptr)
// Assign each byte slice to its appropriate offset.
for i := 0; i < len(list); i++ {
element := (**C.char)(unsafe.Pointer(uintptr(ptr) + uintptr(i)*ptrSize))
*element = (*C.char)(unsafe.Pointer(&list[i][0]))
}
// Call our C function.
C.test((**C.char)(ptr), C.size_t(len(list)))
}
输出如下:
$ go run charlist.go
0: foo
1: bar
2: baz