Types Golang:使用CGo导出外部可见的C字段

Types Golang:使用CGo导出外部可见的C字段,types,struct,go,type-conversion,cgo,Types,Struct,Go,Type Conversion,Cgo,背景:我正在尝试制作一个包,该包基本上围绕我正在使用的C库提供精简的Go包装。这个包有意地非常原始,因为其他几个包依赖于C库的低级功能,我不想复制一堆Go包装器代码 假设我有一个C结构,它看起来像: typedef struct { uint32_t fizz; uint64_t buzz; } test 在CGo中,我包装C-struct并创建新方法,如下所示: package test type Test C.test func NewTest() *Test

背景:我正在尝试制作一个包,该包基本上围绕我正在使用的C库提供精简的Go包装。这个包有意地非常原始,因为其他几个包依赖于C库的低级功能,我不想复制一堆Go包装器代码

假设我有一个C结构,它看起来像:

typedef struct {
    uint32_t fizz;
    uint64_t buzz;
} test
在CGo中,我包装C-struct并创建新方法,如下所示:

package test    

type Test C.test

func NewTest() *Test {
    return &Test{1,2}
}
问题是在包之外,我无法访问C-struct中的字段

package main

import "test"

func main() {
    t := test.NewTest()
    _ = t.fizz // ERROR!!! Unexported field name!!
}

除了为每个字段创建访问器方法外,还有什么简单的方法吗?

是的,您可以导出C结构。但导出C结构时需要遵循与导出Golang结构相同的规则

梅因,加油 test/test.go 测试/测试.h
#包括
类型定义结构{
uint32\u t Fizz;//注意第一个字符是大写的
uint64_t嗡嗡声;
}试验;

如果出于任何原因无法修改C结构中的字段名,则需要创建一个新的C结构,该结构与确切的布局匹配,但使用大写标识符

不,但是你应该重新考虑你为什么要这么做?
package main

import "test"

func main() {
    t := test.NewTest()
    println(t.Fizz)
}
package test

/*
   #include "test.h"
*/
import "C"

type Test C.test

func NewTest() *Test {
    return &Test{Fizz: 1, Buzz: 2}
}
#include <stdint.h>

typedef struct {
    uint32_t Fizz;   // notice that the first character is upper case
    uint64_t Buzz;
} test;