go - Cgo:找不到使用带有 const char* 参数的回调的方法

标签 go callback cgo

我正在使用 Go 中的 C 库,使用 Cgo 并且除了回调之外一切都很好。库有回调 setter ,它接受指向回调函数的指针。回调函数本身用 go 编写并使用 Cgo 语法导出。
问题:我可以使用 char * 参数创建和导出函数,但不能使用 const char *

代码说明:
test.go:

package main

/*
typedef void (*cb_func)(const char *, int);
void callback(cb_func);
void myFunc(const char *, int);
*/
import "C"
import (
        "fmt"
        "unsafe"
)

//export myFunc
func myFunc(buf *C.char, ln C.int) {
        fmt.Printf("Got: %s\n", C.GoStringN(buf, ln))
}

func main() {
        C.callback((C.cb_func)(unsafe.Pointer(C.myFunc)))
}

测试.c:

typedef void (*cb_func)(const char *, int);

void callback(cb_func cb) {
        cb("test", 4);
}

go build 的输出:

In file included from $WORK/test/_obj/_cgo_export.c:2:0:
./test.go:54:13: error: conflicting types for 'myFunc'
./test.go:7:6: note: previous declaration of 'myFunc' was here
 void myFunc(const char *, int);
      ^
/tmp/go-build994908053/test/_obj/_cgo_export.c:9:6: error: conflicting types for 'myFunc'
 void myFunc(char* p0, int p1)
      ^
In file included from $WORK/test/_obj/_cgo_export.c:2:0:
./test.go:7:6: note: previous declaration of 'myFunc' was here
 void myFunc(const char *, int);
      ^

如果没有 const 限定符,代码将按预期编译和工作。

什么可以代替 *C.char 来获取 C 中的常量字符串?

最佳答案

由于 Go 没有指针的 const 修饰符,因此无法从 Go 代码内部转换此行为。 cgo 将始终生成没有 const 修饰符的 header 。这也是您的代码无法正确构建的原因:cgo 仅根据它所知道的创建 myFunc:buf 应该是 char*,不是 const char*

处理此问题的最佳方法是在 C 端使用包装器,将参数转换为 const char*。在您的情况下,将 myFunc 的定义更改为 void myFunc(char*, int) 就足够了。将函数传递给 cb_func 将起作用,因为将 myFunc 转换为 (*cb_func)(const char*,int) 只会添加类型信息,但不会不改变内存布局。

关于go - Cgo:找不到使用带有 const char* 参数的回调的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32938558/

相关文章:

bash - 在golang中一起执行bash echo和nc

c - C 中的 "CALLBACK"声明有什么作用?

javascript - 如何在 jQuery 触发器 ("click"上运行回调函数?

c++11 - cgo 不包含 CXXFLAGS

用于构建 Golang 二进制文件的 Docker 镜像

go - 使用包变量而不是创建局部变量

reflection - 如何使用 reflect 遍历结构

jquery - 如何将点击函数放入回调函数中?

go - 字符串到 char (*array)[]