如何在 cgo 中使用另一个包中定义的枚举和结构?

问题描述 投票:0回答:1

当我想创建在另一个包中定义的结构实例时,我会收到 IncompleteAssign 错误。

该项目具有以下结构:

def.go
root/root.go

def.go 中,结构体定义如下:

package fastlogging

/*
#cgo LDFLAGS: -L. -L../lib -lcfastlogging
#include "../h/cfastlogging.h"
*/
import "C"

type ServerConfig struct {
    Config *C.CServerConfig
}

root.go 我想创建这个结构的一个实例:

package root

/*
#cgo LDFLAGS: -L. -L../lib -lcfastlogging
#include "../../h/cfastlogging.h"
*/
import "C"
import (
    logging "gofastlogging/fastlogging"
    "gofastlogging/fastlogging/logger"
    "unsafe"
)

func GetServerConfig() logging.ServerConfig {
    config := C.root_get_server_config()
    ptr := unsafe.Pointer(config)
    config2 := (*C.CServerConfig)(ptr)
    return logging.ServerConfig{Config: config2}
}

这会导致以下错误消息:

cannot use config2 (variable of type *_Ctype_struct_CServerConfig) as *fastlogging._Ctype_struct_CServerConfig value in struct literal

我该如何解决这个问题?

go struct enums cgo
1个回答
2
投票

您正在导入相同的

.h
文件来定义两种不同的 Go 类型。尽管它们具有相同的内存布局,但它们具有不同的(包)名称和类型。

最好将所有 cgo 内容保存在一个文件中

gofastlogging/fastlogging/def.go
:

package fastlogging

// #include "../h/cfastlogging.h"
import "C"

type ServerConfig struct {
    Config *C.CServerConfig
}

func GetServerConfig() ServerConfig {
    config := C.root_get_server_config()
    return ServerConfig{Config: config}
}

然后从

root.go
使用它,例如:

package root

import (
    "fmt"

    "your.domain/gofastlogging/fastlogging"
)

func main() {
    config := fastlogging.GetServerConfig()
    fmt.Println(config)
}

请注意,您应该声明

CServerConfig* root_get_server_config() {
    //  ...
}

避免在 Go 代码中进行强制转换。

© www.soinside.com 2019 - 2024. All rights reserved.