分享
  1. 首页
  2. 文章

golang(cgo)---如何在两个不同的package中使用同样的自定义数据类型?

FreeApe · · 1720 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

如何在两个不同的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 %c\n", 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)
}

$go run main.go 出现错误

.\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中type GData C.struct_Data,再到main.go中直接使用common.GData类型即可,不需要在main.go中再次包含data.h头文件。

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中的结构体的成员变量的命名还是以小写开头。
首先需要知道的是,在不同的package中,include相同的头文件中数据类型,然后使用这个数据类型去传递到另一个package中的function中是会报上面的错误的。第二种方式就是利用set/get方式来操作。重新写common.go和main.go:

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 %c\n", data.a, 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类型。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1720 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏