1

背景: 使用している C ライブラリの周りに薄い Go ラッパーを本質的に提供するパッケージを作成しようとしています。他のいくつかのパッケージは C ライブラリの低レベル機能に依存しており、大量の Go ラッパー コードをコピーパスタしたくないため、このパッケージは意図的に非常に未加工です。

次のような C 構造体があるとします。

typedef struct {
    uint32_t fizz;
    uint64_t buzz;
} test

CGo では、C 構造体をラップして、次のように新しいメソッドを作成します。

package test    

type Test C.test

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

問題は、パッケージの外では、C 構造体のフィールドにアクセスできないことです。

package main

import "test"

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

これを回避する簡単な方法はありますか (すべてのフィールドのアクセサ メソッドを作成する以外に)?

4

1 に答える 1

1

はい、C 構造体をエクスポートできます。ただし、C 構造体をエクスポートするには、Golang 構造体をエクスポートする場合と同じルールに従う必要があります。 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}
}

テスト/test.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 に答える