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

关键修改点:

  1. 使用C.GoString()函数将C的char*指针转换为Go的string类型
  2. 转换后的字符串可以直接传递给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字符串的内容,所以对于大型字符串需要注意性能影响。

回到顶部