【发布时间】:2019-01-24 05:43:30
【问题描述】:
我可以将 *[]string 从 Go 传递给 C,然后将 append 传递给字符串切片,还是违反了 pointer passing spec?
Go 代码可以将 Go 指针传递给 C,前提是它指向的 Go 内存不包含任何 Go 指针。
示例代码:
package main
/*
extern void go_callback(void*, char*);
static inline void callback(void* stringSliceGoPointer) {
go_callback(stringSliceGoPointer, "foobar");
}
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
a := make([]string, 0)
C.callback(unsafe.Pointer(&a))
fmt.Println(a[0]) // outputs foobar
}
//export go_callback
func go_callback(stringSliceGoPointer unsafe.Pointer, msg *C.char) {
slice := (*[]string)(stringSliceGoPointer)
*slice = append(*slice, C.GoString(msg))
}
【问题讨论】: