gpt4 book ai didi

pointers - 指针字符串 slice (*[]string)的Cgo指针传递规则?

转载 作者:IT王子 更新时间:2023-10-29 01:25:58 28 4
gpt4 key购买 nike

我能否将 *[]string 从 Go 传递给 C,然后 append 到字符串 slice ,或者它是否违反了 pointer passing spec

Go code may pass a Go pointer to C, provided the Go memory to which it points does not contain any Go pointers.

示例代码:

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))
}

最佳答案

不,这不可能。

引用this进一步解释 go 数据类型。

基本上 Go 中的字符串类型看起来像这样。

str := "hello"

这存储为,

 str:                0xad234e3b:
┌──────────┬─┐ ┌───┬───┬───┬───┬───┐
|0xad234e3b|5| ┌──>|104|101|108|108|111| -->[5]byte
└────┬─────┴─┘ | └───┴───┴───┴───┴───┘
└──────────┘

考虑一片:

arr := string{"hi!","hello"}

进一步的Slice数据类型包含指针、长度、容量。

arr:                   0xd2b564c7:        0xad234e40:
┌──────────┬─┬─┐ ┌──────────┬─┐ ┌───┬───┬──┐
|0xd2b564c7|2|2| ┌──> |0xad234e40|3|────>|104|105|33| -->[3]byte
└────┬─────┴─┴─┘ | ├──────────┼─┤ └───┴───┴──┘
└────────────┘ |0xad234e4b|5|──┐ 0xad234e4b:
└──────────┴─┘ | ┌───┬───┬───┬───┬───┐
└─>|104|101|108|108|111| -->[5]byte
└───┴───┴───┴───┴───┘

其中十六进制值代表地址。

实际存储数据的地方是一个[x]byte的数组。

x 表示数据(数组)的大小。

很明显 []string 本身包含许多 (x) 个指针,而 *[]string 是一个额外的指针。

关于pointers - 指针字符串 slice (*[]string)的Cgo指针传递规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51891020/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com