首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从Go函数返回C指针?

如何从Go函数返回C指针?
EN

Stack Overflow用户
提问于 2017-10-06 01:41:47
回答 1查看 1.1K关注 0票数 1

我有一个问题,在C上可以从Go函数指针返回吗?例如,main.c可以是:

代码语言:javascript
运行
复制
struct open_db_return db_ptr = open_db(db_path);
  GoSlice backet = {"DB", 2, 2};
  GoSlice key = {"CONFIG", 6, 6};
  struct get_value_return val = get_value(db_ptr.r0, backet, key);
  close_db(db_ptr.r0);

接下来是Go代码:

代码语言:javascript
运行
复制
//export open_db
func open_db(path string) (interface{}, error) {
    db, err := db.Open(path, 0600, nil)
    if err != nil {
        return nil, err
    }
    return db, nil
}

//export close_db
func close_db(db interface{}) {
    ldb := db.(*db.DB)
    ldb.Close()
}

//export get_value
func get_value(db interface{}, backet_name []byte, key_name []byte) ([]byte, error) {
    ldb := db.(*db.DB)
    var value []byte
    fn := func(tx *db.Tx) error {
        value = tx.Bucket(backet_name).Get(key_name)
        return nil
    }
    return value, ldb.View(fn)
}

cgo命令go build -buildmode=c-archive test.go之后,我收到了头文件,并试图通过命令gcc -g -pthread main.c test.a -o main将它链接到我的c项目中,所有的编译和链接都成功了,但在运行时我收到了下一个错误:panic: runtime error: cgo result has Go pointer我的想法是在c中接收指向DB的指针,做一些工作,当DB不需要时关闭DB。

EN

Stack Overflow用户

发布于 2017-10-06 01:46:15

正如JimB所说,这可能不会起作用(它之所以被称为unsafe是有原因的)。即使您设法将指针指向C可使用的内容,也存在很大的风险,因为Go中的垃圾回收可能会释放底层资源,因为Go不知道C中的用法

原始答案

我认为open_db的签名应该是:func open_db(path string) (unsafe.Pointer, error)

变量db应该像这样天真地转换为unsafe.Pointerreturn unsafe.Pointer(db), err,但我不知道本例中数据库实现的细节。

您的close_db函数可能还需要接受unsafe.Pointer而不是interface{}

请参阅:https://golang.org/cmd/cgo/

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46591758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档