gpt4 book ai didi

go - 如何将字符串从 JSON 返回给 C 调用者(Golang CGO)?

转载 作者:IT王子 更新时间:2023-10-29 01:19:51 26 4
gpt4 key购买 nike

我正在尝试在 Go 中开发一个将由 C++ 程序调用的例程。 Go 如下所示:

package main

import (
"C"
"encoding/json"
"log"
)

type keydata struct {
Key string `json:"key"`
Error string `json:"Error"`
}

func lookupKey() string {
//simplified to remove the call to web service
body := "{\"key\": \"blahblah\", \"Error\": \"\"}"

k := keydata{}
err := json.Unmarshal([]byte(body), &k)
if err != nil {
log.Fatal(err)
}

return k.Key
}

//export GetKey
func GetKey() string {
theKey := lookupKey()
return theKey
}

func main() {}

如果我将一些硬编码值替换为 return k.Key 语句,一切正常,C 或 C++ 可以调用导出的 GetKey 函数。当我尝试从 k.Key 返回解码后的 JSON 字符串或者甚至只是从名为 body 的变量返回字符串时 - 我收到一个错误:

运行时错误:cgo 结果有 Go 指针goroutine 17 [正在运行,锁定到线程]

我正在构建它如下:

go build -buildmode=c-archive example.go

C++ 构建如下:

g++ -pthread test.cpp example.a -o test

要在不引发 panic 错误的情况下完成这项工作,我缺少什么?我正在四处寻找答案,但尚未解决。

@JimB 和@Jsor,非常感谢您的回复。返回 *C.char 确实有效。不过,我想知道,当我在自动生成的头文件 Go 中将它作为 Go 字符串在后台返回时,实际上创建并传递了一个名为 GoString 的 C 结构,其中包含一个名为 p 的字符数组和名为 n 的长度。只要我传递一个硬编码的字符串而不是 k.Key 它就可以正常工作,我可以在 C++ 中查询自动生成的 char 数组。当我尝试返回 k.Key 时,它抛出一个字符串异常。是否可以转换 Go 字符串或向导出装饰添加一些符号以使其工作?

我当然可以返回 C.CString 字符数组并使其工作 - 谢谢!我也只是想了解为什么它在返回硬编码字符串时有效,而不是在我发布的示例中。

感谢你们的时间和解释。

最佳答案

您不能将 Go string 返回给 C 函数。如果你想要一个 C 字符串,你可以使用 C.CString 函数创建一个并返回一个 *C.char

//export GetKey
func GetKey() *C.char {
theKey := lookupKey()
return C.CString(theKey)
}

此函数的返回值必须在 C 代码中显式释放。

如果释放分配的缓冲区不方便,通常会填充调用者提供的缓冲区:

func GetKey(buff *C.char, n int) int

如果可以分配内存但不想处理 C 字符串,可以将缓冲区插入指针并返回大小。

func GetKey(buff **C.char) int

关于go - 如何将字符串从 JSON 返回给 C 调用者(Golang CGO)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37417901/

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