1

背景:我正在尝试制作一个包,该包基本上提供围绕我正在使用的 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!!
}

有什么简单的方法可以解决这个问题(除了为每个字段创建访问器方法)?

4

1 回答 1

1

是的,您可以导出 C 结构。但是您需要遵循与导出 Golang 结构相同的规则来导出 C 结构。 http://golang.org/ref/spec#Exported_identifiers

main.go

package main

import "test"

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

测试/test.go

package test

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

type Test C.test

func NewTest() *Test {
    return &Test{Fizz: 1, Buzz: 2}
}

测试/测试.h

#include <stdint.h>

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

如果由于某种原因您无法修改 C 结构中的字段名称,那么您将需要创建一个与确切布局匹配的新 C 结构,但使用大写标识符。

于 2014-08-13T14:36:26.710 回答