如何像python中一样动态导入模块

时间:2019-06-29 18:57:57

标签: go

我正在开发一个应用程序,旨在在Unix系统上执行各种检查。我曾经在Python中为另一个项目完成过此操作,但是由于无法将其安装在需要执行检查的服务器上,因此无法使用该语言。我之所以选择Go,是因为它易于静态编译,并且无需安装任何东西即可支持多种平台。

无论如何,我想拥有一个文件夹来存放定义为模块的每个支票,在python中看起来像这样:

CheckFolder = "checks"
sys.path.append(CheckFolder)

def getChecks():
  checks = []
  possibleChecks = os.listdir(CheckFolder)
  for check in possibleChecks:
     if (
        check.endswith('.py') and
        check != '__init__.py'
     ):
        checks.append(check[:-3])
  return checks

def loadCheck(check):
  return importlib.import_module(check)

要运行检查,我循环:

for check in getChecks():
    loaded_check = loadCheck(check)
    loaded_check.run()

我不知道这在go中是否可行,因为这是一种编译语言。我想在编译时加载checks文件夹中的每个模块,并运行它们的run函数,而无需分别指定和导入每个模块。

这是我到目前为止所尝试的:

src/checks/checks.go

func GetCheckers() []string {
   var filenames []string
   files, err := ioutil.ReadDir("src/checks/checkers")
     if err != nil {
        fmt.Print(err)
     }
   for _, file := range files {
      filenames = append(filenames, file.Name()[0:len(file.Name())-3])
   }
   return filenames
}

main_check.go

package main

import (
  "fmt"
  "checks"
)

func main() {
  checkers := checks.GetCheckers()
  for _, check := range checkers {
     fmt.Print(check)
     check.run() // This does not work as checks are strings and not func
  }
}

go编程方面我是一个菜鸟:/非常感谢您的帮助和建议。

0 个答案:

没有答案