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

Go 的构建模式的更多相关文章

  1. 构建模式--Adapter模式(JAVA)

    适配器模式: 适配器就相当于我们的转接头,比如手机充电器插头(小米和华为的手机充电器不能共用,这时候就可以给华为的充电器按一个转接头,就可以给小米手机充电). 同理,当一个类(充电器 HuaweiCh ...

  2. webpack构建vue项目(再谈配置)

    webpack配置起来确实麻烦,这不,之前用刚配好了vue1+的版本,结果在(部分)安卓机上测试,发现存在开启热加载(dev-server)的情况下不能识别vue语法的问题,试了很多方法,都没能很好的 ...

  3. 【转】设计模式(九)外观模式Facade(结构型)

    设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

  4. 【转】设计模式(三)建造者模式Builder(创建型)

    (http://blog.csdn.net/hguisu/article/details/7518060) 1. 概述 在软件开发的过程中,当遇到一个"复杂的对象"的创建工作,该对 ...

  5. 设计模式之:组合模式(Composite)

    支持原创:http://blog.csdn.net/hguisu/article/details/7530783 设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构 ...

  6. 设计模式(十一):FACADE外观模式 -- 结构型模式

    1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇 ...

  7. 设计模式(十):Decorator装饰者模式 -- 结构型模式

    1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继 ...

  8. 设计模式(九):Composite组合模式 -- 结构型模式

    1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对 ...

  9. 设计模式(八):Bridge桥接模式 -- 结构型模式

    1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 ...

随机推荐

  1. Spring 使用介绍(十二)—— Spring Task

    一.概述 1.jdk的线程池和任务调用器分别由ExecutorService.ScheduledExecutorService定义,继承关系如下: ThreadPoolExecutor:Executo ...

  2. mpvue——引入antv-F2图表

    踩坑中~ 官方文档 https://www.yuque.com/antv/f2/intro 毕竟不像echarts接触过,所以还是先看看文档较好 github https://github.com/s ...

  3. Android Studio导入jar包

    使用开源框架是,可以直接复制源代码到自己的项目(本人在Android Studio中操作报R程序包不存在),也可以使用jar包,下面记录一下今天使用SmartImageView.jar的过程,不记录S ...

  4. Catch the Theves HDU - 3870(s - t平面图最小割)

    题意: 板题...建个图..跑一遍spfa就好了...嘻嘻... 注意..数组大小就好啦..400 * 400 = 1600 我也是抑郁了..沙雕的我.. #include <iostream& ...

  5. MS-DOS 系统汇编环境之DOSBOX+vim

    经过虚拟机的体验,我发现还是dosbox里汇编比较方便..... 一.下载安装 dosbox DOSBOX 准备好 masm.exe.link.exe.debug.exe,放在~/dos下(文件夹名字 ...

  6. 【BZOJ 1701】Cow School(斜率优化/动态凸包/分治优化)

    原题题解和数据下载 Usaco2007 Jan 题意 小牛参加了n个测试,第i个测试满分是\(p_i\),它的得分是\(t_i\).老师去掉\(t_i/p_i\)最小的d个测试,将剩下的总得分/总满分 ...

  7. python 识别验证码

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/instal ...

  8. BZOJ2961 共点圆[CDQ分治]

    题面 bzoj 其实就是推一下圆的式子 长成这个样子 假设要查询的点是(x, y) 某个圆心是(p, q) \((x - p)^2 + (y - q)^2 \leq p^2 + q^2\) 变成 \( ...

  9. dns配置文件

    /etc/resolv.conf 该文件是DNS域名解析的配置文件,它的格式很简单,每行以一个关键字开头,后接配置参数. resolv.conf的关键字主要有四个,分别是: nameserver   ...

  10. Tarjan求有向图强连通详解

    Tarjan求有向图强连通详解 注*该文章为转发,原文出处已经不得而知 :first-child { margin-top: 0; } blockquote > :last-child { ma ...