• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go 的构建模式

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Go 的八种 Build Mode 

  • exe (静态编译)
  • exe (动态链接 libc)
  • exe (动态链接 libc 和非 Go 代码)
  • pie 地址无关可执行文件(安全特性)
  • c-archive C 的静态链接库
  • c-shared C 的动态链接库
  • shared Go 的动态链接库
  • plugin Go 的插件

plugin Go 的插件 

插件形式和 c-sharedshared 相似,都是构建一个动态链接库,和 shared 一样,这是构建一个 Go 专用的动态链接库,而和 shared 不同的是,动态链接库并非在程序启动时加载,而是由程序内决定何时加载和释放。

我们创建一个 plugin,myplugin.go

package main
 
import "fmt"
 
func Hello() {
    fmt.Println("Hello, World!")
}

可以看到,这和最初那个静态链接库的性质相似。不过不同的是,这里既没有 import "C",也没有 //export Hello,而且也没有 func main()

因为这里不需要,我们是 Go 调用 Go 的代码,因此很多东西都省了。

调用代码这么写:

package main

import "plugin"

func main() {
	//	加载 myplugin 库
	p, err := plugin.Open("myplugin.so")
	if err != nil {
		log.Fatal(err)
	}
	//	取得 Hello 函数
	fn, err := p.Lookup("Hello")
	if err != nil {
		log.Fatal(err)
	}
	//	调用函数
	fn.(func())()
}

可以看到,这个逻辑上,和 hello-dyn.c 很相似。plugin.Open() 有点儿像 dlopen();而 p.Lookup() 有点儿像 dlsym()

实际上也是如此,底层实现的时候就是调用的这两个函数。

注意这里的 fn.(func())()p.Lookup() 返回的是一个 interface{},因此这里需要转型为具体函数类型。

用下面的命令构建:

go build -buildmode=plugin myplugin.go
go build runplugin.go

前者会生成一个 myplugin.so,后者会生成调用者 runplugin

-rw-r--r-- 1 root root 3.8M Oct  3 13:58 myplugin.so
-rwxr-xr-x 1 root root 3.5M Oct  3 13:58 runplugin

 

转载文章:https://blog.lab99.org/post/golang-2017-10-01-video-go-build-mode.html

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
神奇的GO语言:空接口(interface)发布时间:2022-07-10
下一篇:
安装配置Go开发环境-Goclipse发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap