Golang中共享库的使用与实现
Golang中共享库的使用与实现
我正在尝试使用以下命令在 Go 中创建一个共享库(libname.so):
go build -buildmode c-shared -o testlib.so test.go,其中 test.go 包含以下代码:
package main
import “C”
type person struct {
name string
age int
}
//export newPerson
func newPerson(name string) *person {
p := person{name: name}
p.age = 42
return &p
}
func main(){}
它给出了一个错误:“Go type not supported in export: struct”。
有人能帮忙吗?
更多关于Golang中共享库的使用与实现的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
更多关于Golang中共享库的使用与实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是否意味着我无法在Go语言中创建一个共享库,该库的函数可以接受任何结构体作为参数?
如果是这样,那么未来会支持这个功能吗?
在Go中导出结构体到C共享库时,需要遵循特定的规则。错误“Go type not supported in export: struct”是因为直接导出的函数不能返回Go结构体指针到C代码中。你需要使用C类型来包装数据。
以下是修正后的示例:
package main
import "C"
import "unsafe"
// 使用C兼容的类型定义
type person struct {
name *C.char
age C.int
}
//export newPerson
func newPerson(name *C.char) unsafe.Pointer {
p := &person{
name: C.CString(C.GoString(name)),
age: C.int(42),
}
return unsafe.Pointer(p)
}
//export getPersonAge
func getPersonAge(p unsafe.Pointer) C.int {
return ((*person)(p)).age
}
//export freePerson
func freePerson(p unsafe.Pointer) {
personPtr := (*person)(p)
C.free(unsafe.Pointer(personPtr.name))
}
func main() {}
编译命令:
go build -buildmode=c-shared -o testlib.so test.go
对应的C头文件会包含:
typedef void* Person;
extern Person newPerson(char* name);
extern int getPersonAge(Person p);
extern void freePerson(Person p);
使用示例(C代码):
#include "testlib.h"
#include <stdio.h>
int main() {
Person p = newPerson("John");
printf("Age: %d\n", getPersonAge(p));
freePerson(p);
return 0;
}
关键点:
- 使用
unsafe.Pointer作为C可识别的通用指针类型 - 字符串需要通过
C.CString()转换并手动管理内存 - 所有导出的函数参数和返回值必须是C兼容类型
- 需要显式提供内存释放函数
注意:使用unsafe.Pointer需要确保类型安全,避免内存泄漏。

