当我想创建在另一个包中定义的结构实例时,我会收到 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
我该如何解决这个问题?
您正在导入相同的
.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 代码中进行强制转换。