Golang Go语言中cgo调用C结构时遇到字段被屏蔽

发布于 1周前 作者 vueper 来自 Go语言

cgo 的时候遇到一个奇怪的东西, c 的 struct 里面字段都正常, 但是 cgo 仅仅拿到第一个字段,后面直接下划线给屏蔽了,这是为什么,看了下也没什么关键字啊

c struct:

typedef struct _NF_IP_PACKET_OPTIONS
{	
	unsigned short	ip_family;			
	unsigned int	ipHeaderSize;   	
	unsigned long	compartmentId;	
	unsigned long	interfaceIndex;   	
	unsigned long	subInterfaceIndex; 
	unsigned long	flags;				
} NF_IP_PACKET_OPTIONS, *PNF_IP_PACKET_OPTIONS;

test:

aaaa := &C.struct__NF_IP_PACKET_OPTIONS{}  
fmt.Printf("aaaa %+v", aaaa)

output:

aaaa &{ip_family:0 _:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]}

Golang Go语言中cgo调用C结构时遇到字段被屏蔽

更多关于Golang Go语言中cgo调用C结构时遇到字段被屏蔽的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

暂时找到问题了,mingw gcc 编译器的缓存好像,但是不知道在哪里清

更多关于Golang Go语言中cgo调用C结构时遇到字段被屏蔽的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


换了试了下。。。 他妈的也不行

在Go语言中,使用cgo来调用C语言的代码和结构时,如果遇到C结构的字段在Go中被屏蔽(即无法直接访问),这通常是因为Go和C之间的类型系统和内存布局差异导致的。以下是一些可能的解决方案和建议:

  1. 检查字段名冲突:确保C结构中的字段名没有与Go的保留字或关键字冲突。如果有冲突,考虑在C代码中重命名这些字段。

  2. 使用struct tag:在Go中定义对应的结构体时,可以使用struct tag来明确指定字段与C结构中的对应关系。这有助于cgo正确解析和映射C结构的字段。

  3. 调整内存布局:如果C结构使用了特殊的内存对齐或填充,确保Go中的结构体也遵循相同的布局。可以使用Go的unsafe包和syscall包中的类型来模拟C的内存布局。

  4. 使用指针和类型转换:有时,通过指针和类型转换可以绕过cgo的限制,直接访问C结构的内存。但这种方法需要谨慎使用,因为它可能破坏类型安全和内存安全。

  5. 查阅cgo文档和社区资源:cgo是一个复杂的特性,查阅官方文档和社区资源(如Stack Overflow、GitHub Issues等)可能会找到针对特定问题的解决方案或工作区。

总之,解决cgo中字段被屏蔽的问题通常需要仔细分析C和Go的结构定义,以及它们之间的内存布局和类型对应关系。

回到顶部