当前位置: 首页 > 知识库问答 >
问题:

将C结构从主golang代码传递到不同golang包中的函数

阎弘雅
2023-03-14

我试图通过C结构从主要Go语言代码到不同的包,并得到类型转换错误。

C头文件test.h

#include<stdio.h>
struct err_struct {
        int   errnum;
};

高浪包测试

package test
//#include<test.h>
import "C"
func ConvertCtoGoError(err_struct *C.struct_err_struct) {
   //some code
}

Go语言主要代码

package main
import (
        "./lib"
        "fmt"
       )   
/*
#include"lib/test.h"

struct err_struct initialize_structure() 
{
    struct err_struct err;
    err.errnum = 102;
    return err;

}
 */
import "C" 
func main() {
    go_struct:= C.initialize_structure()
    new_struct:= test.ConvertCtoGoError(&go_struct)

}  

编译主代码时,我收到以下错误:无法转换

当我尝试对变量进行类型转换时,它给出了以下错误:无法引用未报告的名称测试_Ctype_struct_dd_err_struct无法转换

请帮我解决这个问题

共有1个答案

穆正祥
2023-03-14

根据go文件https://golang.org/cmd/cgo/,

"Cgo将C类型转换为等效的未导出Go类型。由于转换未导出,因此Go包不应在其导出的API中公开C类型:一个Go包中使用的C类型与另一个Go包中使用的相同C类型不同。"

有关github的问题可以在这里找到:https://github.com/golang/go/issues/13467

到目前为止,建议不要在导出的API中公开C类型

 类似资料:
  • c.h 得到这样的结果: 这似乎不正确, 我正在golang寻找类似的东西:mvar.VI32 谢谢 我的头很痛,不擅长C / C, 这是我的场景,调用一个SDK(带有.so库) c.h 我试着用Go语言调用函数ASFGetActiveFileInfo,如下所示: 得到这个错误: 尝试: 得到这个错误 这个问题有什么解决方案吗? 感谢@peterSO的回答,它工作,但仍然显示错误: 事实非常接近

  • 问题内容: 可以在Golang中定义一个不变的结构吗?一旦初始化,则只能对struct的字段进行读取操作,而无需修改字段值。如果是这样,该怎么做。 问题答案: 通过使其成员不导出并提供阅读器,可以在其程序包外部将结构设为只读。例如: 和用法:

  • 问题内容: 我有一个简单的问题…我正在尝试使用切片在Golang中重现此递归数据结构。 现在,我在下面使用带有切片的递归数据结构的“粗糙”源代码,除了我输入的结构是结构而不是结构片之外,其他所有东西都可以正常工作。理想情况下,我希望类型化的递归数据结构是Trie的一部分,其中包含元素Trie {byte,[] Trie}。希望这有意义吗?现在,我有一个Trie struct {byte,[] Tr

  • 问题内容: 我正在尝试使用SWIG为python包装一个C ++库。该库通过将 某些类型的回调函数 传递给类方法来频繁使用回调函数。 现在,在包装代码之后,我想从python创建回调逻辑。这可能吗?这是我正在尝试发现的实验..目前不起作用。 头文件和swig文件如下: paska.h: paska.i: 最后,我在python中测试.. 最后一行抛出“ TypeError:方法’handleri_

  • 我试图通过删除“内部”恢复func来实现这一点,但在这种情况下,“主”恢复不能恢复“内部”goroutine内部的恐慌。 操场 我试图听从@momer的建议,通过通道发送错误并在主goroutine中处理它,而不是试图制造恐慌:

  • 我正致力于直接在戈朗开发一个技术指标库。除其他外,这是学习戈朗语的练习。 我一直在验证我的算法的结果,方法是用TA-Lib(或者更确切地说是TA-Lib的ruby包装器)生成的数据构建测试用例。 上面的问题涉及浮点数学的一个非常简单的表现形式。很难确认一段较长的代码是否真的解决了这个问题。 我如何确认它只是浮点数学的变体,因为顺序? /结束编辑