我们可以使用go进行模块的通用导入。更清楚,这是用例:
package main
import (
"fmt"
"net/http"
)
json handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "you requested", r.URL.Path)
}
func main() {
var moduleName String = "/path/to/module"
import moduleName
http.HandleFunc("/", handler)
http.ListenAndServe(":8000", nil)
}
所以在main中你可以看到我正在尝试导入moduleName,但是这给了我一个错误。
是否有一些解决方法?
答案 0 :(得分:8)
Go是一种静态编译的语言,而不是像Python这样的解释语言。您的导入发生在编译时,而不是在运行时。所以简而言之,不,你只能在包级别上导入东西。
官方定义明确指出:
导入声明声明包含声明的源文件取决于导入的包的功能,并允许访问该包的导出标识符。
关于导入的另一个有趣的注意事项是,如果导入了一个包并且具有init()
函数,则在程序启动时将调用此函数来初始化包;来自文档:
如果包具有导入,则在初始化包本身之前初始化导入的包
这为动态实施提供了一些空间,但它远非动态导入。
答案 1 :(得分:1)
Google Go本身不支持动态导入。有关此主题的更多信息,请参阅此处:How to import package by path from string in Go?
在论坛讨论中,建议的解决方案是使用您的特定模块调用编译器。然而,这不是一般做法。讨论可以在这里找到:https://groups.google.com/forum/#!topic/golang-nuts/Rm0gcBPbxLk
一般而言,我会建议反对任何此类计划。可能有不同的方法来实现具有相同功能的程序。如果您无法为Google Go找到另一种方案,请尝试在C ++中搜索相同类型的方案,它们通常非常相似。