golang(cgo)---如何在两个不同的package中使用同样的自定义数据
??如何在两个不同的package中使用同样的自定义数据类型?这里主要针对包括在C头文件中结构体类型,如果只是在不同的go package中自定义数据类型,这个很好处理。但实际上处理的核心是一样的,下面通过两个例子来说明解决办法。 测试例程目录├── include
│ └── data.h
└── src
├── common
│ └── common.go
└── main
└── main.go
测试data.h #pragma once
#include <stdio.h>
struct Data {
int a;
char b;
};
common.go package common
/* #include <stdio.h> #cgo CFLAGS : -I../../include #include "data.h" */
import "C"
import (
"fmt"
)
func Print(data *C.struct_Data) bool {
fmt.Printf("data : %d %cn",data.a,data.b)
return true
}
main.go package main
/* #include <stdio.h> #cgo CFLAGS : -I../../include #include "data.h" */
import "C"
import (
"common"
)
func main() {
data := C.struct_Data{a: C.int(2),b: C.char('b')}
common.Print(&data)
}
.main.go:19: cannot use &data (type *C.struct_Data) as type *common.C.struct_Data in argument to common.Print
错误解决方法方法一??通过将data.h中的接头体的成员变量名都改为大写开头的命名方式。然后在comm.go中 package main
import (
"common"
"fmt"
)
func main() {
data := common.GData{A: 2,B: 'b'}
fmt.Println(data)
common.Print(&data)
}
方法二??第一种方式我们可以自己通过修改data.h头文件达到目的,但是如果我们没有权限修改data.h的内容怎么办呢?即data.h中的结构体的成员变量的命名还是以小写开头。 common.go package common
/* #include <stdio.h> #cgo CFLAGS : -I../../include #include "data.h" */
import "C"
import (
"fmt"
)
type GData C.struct_Data
func (data *GData) GDataSetA(a int) {
data.a = C.int(a)
}
func (data *GData) GDataSetB(b byte) {
data.b = C.char(b)
}
func Print(data *GData) bool {
fmt.Printf("data : %d %cn",data.b)
return true
}
main.go package main
import (
"common"
)
func main() {
data := common.GData{}
data.GDataSetA(2)
data.GDataSetB('b')
common.Print(&data)
}
??这样就统一了同一种数据类型,即在common包中GData类型。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |