进入模块“以后”

时间:2014-05-21 13:39:38

标签: go

我们可以使用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,但是这给了我一个错误。

是否有一些解决方法?

2 个答案:

答案 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 ++中搜索相同类型的方案,它们通常非常相似。