有没有办法在Go中动态解析C struct?

时间:2018-03-19 11:24:42

标签: go struct

我在C中定义了一个结构,如:

struct SomeStruct
{
    int var1;
    bool var2;
    double var3;
    int var4[10];
    int var5[10][10];
}
struct SomeStruct entity;

在某个地方有一个输入框,某些用户在GO中输入:

func("entity.var3")

它将在C struct中返回entity.var3的值。

实际上我已经可以通过cffi和

在python中实现它了
def get_one_variable(buffer, setup):
    value = buffer
    for level in setup:
        if isinstance(level, str):
            value = getattr(value, level)
        else:
            [base, extends] = level
            value = getattr(value, base)
            for extend in extends:
                value = value[extend]
    return value

其中buffer是用“FFI.cdef”定义的python cffi数据指针,设置解析为:

def parse_variable(self, line):
    line = line.replace('\n', '').replace(' ', '')
    split = line.split('.')
    variable = []
    for child in split:
        match = self.BASE_EXT_REGEX.match(child)
        if match is None:
            variable.append(child)
        else:
            base_name = match.group('base_name')
            ext_name = match.group('ext_name')
            variable.append([base_name, [int(index) for index in
                                         ext_name.replace('[', ']').replace(']]', ']').strip(']').split(']')]])
    return variable

所以我可以动态解析“entity.var1”,“entity.var2”,“entity.var3”,“entity.var4 [0]”,“entity.var5 [0] [1]”。

GO中有什么东西或类似东西吗?

1 个答案:

答案 0 :(得分:1)

这是由CGO处理的,这是Go中的一个特殊包,允许简单的C集成。您可以详细了解herehere。举个例子,一个简单的CGO例子是:

/*
struct SomeStruct
{
    int var1;
    bool var2;
    double var3;
    int var4[10];
    int var5[10][10];
}
*/
import "C"
import "fmt"

func main(){
    thing := C.struct_SomeStruct{}
    thing.var1 = C.int(5)
    fmt.Printf("My Struct's var field %d\n",int(thing.var1))
}