加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 18:28:35 所属栏目:大数据 来源:网络整理
导读:??如何在两个不同的package中使用同样的自定义数据类型?这里主要针对包括在C头文件中结构体类型,如果只是在不同的go package中自定义数据类型,这个很好处理。但实际上处理的核心是一样的,下面通过两个例子来说明解决办法。 测试例程目录 ├── include

??如何在两个不同的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)
}

$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 %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类型。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读