如何动态添加导入

时间:2017-05-29 13:40:56

标签: go

我想使用自定义plugins/middleware动态创建HTTP路由器,目前我正在使用config.yml,例如:

plugins:
  - waf
  - jwt 
  - cors

解析yml文件后,我创建了这样的路由:

route := violetear.New()
chain := middleware.New() 
for _, plugin := range Plugins {
    chain := chain.Append(plugin)       
}
router.Handle("/test", chain.Then(myHandler))
log.Fatal(http.ListenAndServe(":8080", router))

为了实现这一点,我必须在导入部分中包含所有插件,例如:

import (
   "net/http"

   "github.com/nbari/violetear"
   "github.com/nbari/violetear/midleware"

   // How to deal with this
   "github.com/example/waf"
   "github.com/example/jwt"
   "github.com/example/cors"
)

我需要将当前的配置格式更改为更有用/通用的东西,例如:

plugins:
  - [github.com/foo, foo]
  - [github.com/bar, bar]

但除此之外,什么是动态"最好的方法。创建导入或生成以后可以编译的代码?

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

Go是一种静态链接语言。这意味着如果在编译时(从您的.go源文件)未引用包,则该包将不会链接/编译到可执行二进制文件中,这意味着它在运行时将不可用。

所以最简单的就是使用导入。

如果您想要真正的动态配置,Go 1.8中引入的plugins可能是您的选择,但使用插件会使事情变得复杂,我只会将其用作最后的手段。另请注意,插件目前仅适用于Linux。

相关问题:

Dynamic loading in Golang?

Go Plugin variable initialization

go 1.8 plugin use custom interface