Golang中C类型到Go函数的undefined错误处理
Golang中C类型到Go函数的undefined错误处理 我的函数接收几个C语言的char类型作为参数,但它们显示为未定义。我已经导入了C包,所以不清楚原因。
package main
import "C"
import (
"fmt"
"github.com/99designs/keyring"
)
//export SetOsStore
func SetOsStore(serviceName *C.char, keyName *C.char, data *C.char) {
ring, _ := keyring.Open(keyring.Config{
ServiceName: serviceName,
})
_ = ring.Set(keyring.Item{
Key: keyName,
Data: []byte(data),
})
i, _ := ring.Get(keyName)
fmt.Printf("%s", i.Data)
}
func main() {}
更多关于Golang中C类型到Go函数的undefined错误处理的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
我不太清楚具体原理,但在 VS Code 中,import "C" 上方有一个链接,写着“重新生成 Cgo 定义”。我点击了它,然后就成功了。
更多关于Golang中C类型到Go函数的undefined错误处理的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这个问题的原因是你没有正确地将C的char*类型转换为Go的字符串类型。在Go中,C的char*类型需要显式转换为Go的string类型才能使用。以下是修正后的代码:
package main
import "C"
import (
"fmt"
"github.com/99designs/keyring"
)
//export SetOsStore
func SetOsStore(serviceName *C.char, keyName *C.char, data *C.char) {
// 将C的char*转换为Go的string类型
serviceNameStr := C.GoString(serviceName)
keyNameStr := C.GoString(keyName)
dataStr := C.GoString(data)
ring, _ := keyring.Open(keyring.Config{
ServiceName: serviceNameStr,
})
_ = ring.Set(keyring.Item{
Key: keyNameStr,
Data: []byte(dataStr),
})
i, _ := ring.Get(keyNameStr)
fmt.Printf("%s", i.Data)
}
func main() {}
关键修改点:
- 使用
C.GoString()函数将C的char*指针转换为Go的string类型 - 转换后的字符串可以直接传递给
keyring包的函数
如果你需要处理可能为空的指针,可以添加安全检查:
func SetOsStore(serviceName *C.char, keyName *C.char, data *C.char) {
var serviceNameStr, keyNameStr, dataStr string
if serviceName != nil {
serviceNameStr = C.GoString(serviceName)
}
if keyName != nil {
keyNameStr = C.GoString(keyName)
}
if data != nil {
dataStr = C.GoString(data)
}
// 剩余代码...
}
注意:C.GoString()会在Go堆上分配内存并复制C字符串的内容,所以对于大型字符串需要注意性能影响。

