golang插件

本文记载下了golang插件的用法, 原文:

https://code.tutsplus.com/tutorials/writing-plugins-in-go--cms-29101

这个例子使用了两个排序: 快速排序和冒泡排序,不追求算法的高效,只为了说明插件的生成和使用。

而且只在linux下,build和运行.(windows环境没有测试过, 原文在windows下要使用docker)

目录:

plugins
├── bubble_sort
│   └── bubble_sort_plugin.go   冒泡排序
├── bubble_sort_plugin.so       编译后的插件
├── quick_sort
│   └── quick_sort_plugin.go     快速排序
├── quick_sort_plugin.so          编译后的插件
├── sort                                    编译后的主程序
└── sort.go                               main()

bubble_sort_plugin.go

package main

func Sort(items []int) *[]int {
    if len(items) < 2 {
        return &items
    }

    tmp := 0

    for i := 0; i < len(items); i++ {
        for j := 0; j < len(items)-1; j++ {
            if items[j] > items[j+1] {
                tmp = items[j]
                items[j] = items[j+1]
                items[j+1] = tmp
            }
        }
    }

    return &items
}

quick_sort_plugin.go

package main

import "math/rand"

func Sort(items []int) *[]int {
    if len(items) < 2 {
        return &items
    }

    peg := items[rand.Intn(len(items))]

    below := make([]int, 0, len(items))
    above := make([]int, 0, len(items))
    middle := make([]int, 0, len(items))

    for _, item := range items {
        switch {
        case item < peg:
            below = append(below, item)
        case item == peg:
            middle = append(middle, item)
        case item > peg:
            above = append(above, item)
        }
    }

    below = *Sort(below)
    above = *Sort(above)

    sorted := append(append(below, middle...), above...)
    return &sorted
}

sort.go

package main

import (
        "fmt"
        "plugin"
        "path/filepath"
)

func main() {
        numbers := []int{5,2,7,6,1,3,4,8}

        all_plugins, err := filepath.Glob("*.so")
        if err != nil {
                panic(err)
        }

        for _, filename := range (all_plugins) {
                p, err := plugin.Open(filename)  // 加载插件
                if err != nil {
                        panic(err)
                }

                symbol, err := p.Lookup("Sort")  // 查找插件里的指定函数
                if err != nil {
                        panic(err)
                }

                sortFunc, ok := symbol.(func([]int) *[]int)

                if !ok {
                        panic("Plugin has no ‘Sort([]int) *[]int)‘ function")
                }

                sorted := sortFunc(numbers)      // 调用插件函数
                fmt.Println(filename, sorted)
        }
}

编译:

编译 bubble_sort_plugin.go:

在bubble_sort目录里:

# go build -buildmode=plugin -o ../bubble_sort_plugin.so

生成的quick_sort_plugin.so在plugins目录里

同样:

在quick_sort目录里:

go build -buildmode=plugin -o ../quick_sort_plugin.so

编译sort.go:

在plugins目录里:

 # go build sort.go

生成 sort (绿色,可执行)

执行sort:

# ./sort
bubble_sort_plugin.so &[1 2 3 4 5 6 7 8]
quick_sort_plugin.so &[1 2 3 4 5 6 7 8]

原文地址:https://www.cnblogs.com/bear129/p/8995304.html

时间: 2024-10-10 06:04:24

golang插件的相关文章

IntelliJ Idea 14 安装 Golang 插件 google-go-lang-idea-

IntelliJ Idea 14 安装 Golang 插件 google-go-lang-idea-plugin 的方法 2015-03-08 16:51   zsjangel 阅读 4249 次   0 人喜欢  1 条评论  收藏 IDEA 的编辑器都很强悍,所以现在学Go 也想用他啊,无奈这个插件搞了好久,整理了下流程记录下 1. 当然是下载 IDEA 编辑器了 http://www.jetbrains.com/idea/download/ 附上旗舰版注册机地址 http://downlo

解决vs code中golang插件依赖安装失败问题

解决vs code中golang插件依赖安装失败问题 Installing github.com/nsf/gocode SUCCEEDED Installing github.com/uudashr/gopkgs/cmd/gopkgs SUCCEEDED Installing github.com/ramya-rao-a/go-outline FAILED Installing github.com/acroca/go-symbols FAILED Installing golang.org/x

IntelliJ IDEA 14安装Golang插件go-lang-idea-plugin

1,下载IntelliJ IDEA旗舰版,我用的是14.1.3版本: http://www.jetbrains.com/idea/download/ 2. 下载golang官方SDK和go-lang-idea-plugin插件源码 http://golang.org/dl/(要翻==墙) https://github.com/go-lang-plugin-org/go-lang-idea-plugin 3,将下载的go-lang-idea-plugin压缩包解压,IDEA点击File -> op

Intellij Idea 14编译golang 插件

最近项目实在太赶了,很久没有写过博文了. 公司新配了一台笔记本电脑,原装win8的.于是又从linux回到了windows.不想用win命令行来搞go了,win下太折腾了.还是用一直使用的idea. golang的插件貌似更新很频繁,都是源码的,所以要自己编译下. 过程如下: 1.下载源码: https://github.com/go-lang-plugin-org/go-lang-idea-plugin/releases/ 2.解压,然后用idea打开. 3.ctrl+alt+shift+s

IntelliJ Idea 14 安装 Golang 插件 google-go-lang-idea-plugin 的方法

IDEA 的编辑器都很强悍,所以现在学Go 也想用他啊,无奈这个插件搞了好久,整理了下流程记录下 1. 当然是下载 IDEA 编辑器了 http://www.jetbrains.com/idea/download/ 附上旗舰版注册机地址 http://download.csdn.net/detail/abacaba/8240327 有购买能力的请尽力购买正版哦,这么好的IDE用盗版真心觉得很罪恶啊,无奈包包里的票票太少 2. 下载插件项目源码自行编译jar插件包 https://github.c

vscode安装golang插件

在vscode中编辑.调试golang时会自动安装插件,然而大部分均会失败. 解决办法:手动安装 1.下载插件 1 cd $GOPATH/src 2 mkdir -p golang.org/x 3 cd golang.org/x 4 git clone https://github.com/golang/tools.git tools 5 git clone https://github.com/golang/lint.git lint 2.安装插件 1 cd $GOPATH 2 go inst

解决vscode中golang插件依赖安装失败问题

vscode中安装ms-vscode.go插件后可以开启对go语言的支持,ms-vscode.go插件需要依赖一些工具,安装完成后提示 Installing github.com/nsf/gocode SUCCEEDEDInstalling github.com/uudashr/gopkgs/cmd/gopkgs SUCCEEDEDInstalling github.com/ramya-rao-a/go-outline FAILEDInstalling github.com/acroca/go-

vs code golang插件

首先推荐一下两个网址: 比较不错的博客:http://www.cnblogs.com/zsy/p/5223957.html 在下载代码时,golang.org/x/tools代码下载不了,可以使用http://www.golangtc.com/download/package解决 =========================================================== 1.下面几个由于不依赖golang.org/x/tools,所以可以正常下载 go get -u

idea编译golang插件总结

由于使用习惯了Idea 和vim插件.于是下载了idea的go插件并安装,可惜不支持go1.4 ,官方的go插件版本太低 133.326 — 133.9999 .只能手动编译 按照这个教程就可以 http://blog.csdn.net/mokt2001/article/details/16962429 但是可能有一个问题,如果你安装了1.4的go idea插件又不支持1.4所以,你要先卸载1.4go ,然后安装1.2的go.然后安装idea的插件,然后再编译最新版的go插件 还有一个问题.是我