golang plugin

本文介绍了如何在Go中动态加载外部go文件并编译为插件,详细步骤包括设置编译参数、定义加载结构和方法、编译成.so文件,以及加载和使用该插件。示例中展示了加载结构体类型并生成slice的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用:动态加载外部 go 文件

加载方式:

1.编译go程序

GOOS=linux GOARCH=amd64  CGO_ENABLED=1  GOPROXY=https://goproxy.cn,direct  GO111MODULE=on  go build -gcflags="all=-N -l"  main.go

此处注意:使用go plugin时 CGO_ENABLED必须开启,添加 -gcflags="all=-N -l"

2.定义加载的 struct和方法

示例如下:

import (
   "C"
   "reflect"
)

type Test struct {
   ID   string `json:"id"`
   Name string `json:"name"`
}

func GetType() reflect.Type {
   return reflect.TypeOf(&Test{})
}

func GetName() string {
   return "test"
}

3.编译外部go文件为 .so文件

go build -buildmode=plugin -gcflags="all=-N -l" -o extend extend/*.go

4.加载编译完成的 .so文件

testFile:="./test.so"
testFuncName := "GetType"
p, err := plugin.Open(testFile)
if err != nil {
   fmt.Println(err)
}
testFunc, err := p.Lookup(testFuncName )
if err != nil {
   fmt.Println(err)
}
//获取 struct 类型,后面可以用该类型使用反射生成对象和slice等
_type := testFunc.(func() reflect.Type)()

4.使用struct类型生成slice,比如[]Test

sliceType := reflect.SliceOf(_type)
testSlice:=reflect.MakeSlice(sliceType, 0, 0).Interface()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值