【问题标题】:Go import modules "later"“稍后”导入模块
【发布时间】:2014-05-21 23:21:54
【问题描述】:

我们能不能用 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,但这给了我一个错误。

有解决办法吗?

【问题讨论】:

  • 为什么要进行这样的导入?
  • 大胆猜测,但如果你想避免导入周期,让实现 HTTP 端点的包从它们的 init()s 注册自己可能会有所帮助,这样你就可以更灵活地选择进口它们。但这在很大程度上取决于您如何布局您的应用程序。这是一个有点相关的答案:stackoverflow.com/questions/20380333/…。如果这是一个循环并且您需要帮助,请发布诸如“我如何避免这个循环?”之类的问题。详细说明什么进口什么以及为什么。

标签: go


【解决方案1】:

Go 是一种静态编译语言,而不是像 Python 这样的解释型语言。您的导入发生在编译时,而不是运行时。所以简而言之,不,你只能在包级别导入东西。

官方定义明确:

导入声明声明包含该声明的源文件依赖于导入包的功能,并允许访问该包的导出标识符。

关于导入的一个更有趣的注意事项是,如果一个包被导入并且具有init() 函数,则在程序启动时将调用此函数来初始化包;来自文档:

如果一个包有导入,则在初始化包本身之前初始化导入的包

这为动态初始化留下了一些空间,但它与动态导入相去甚远。

【讨论】:

    【解决方案2】:

    Google Go 本身不支持动态导入。可以在此处阅读有关此主题的更多信息:How to import package by path from string in Go?

    在论坛讨论中,建议的解决方案是使用您的特定模块调用编译器。然而,这不是一般的做法。讨论可以在这里找到:https://groups.google.com/forum/#!topic/golang-nuts/Rm0gcBPbxLk

    一般而言,我建议不要使用任何此类方案。可能有不同的方法来实现具有相同功能的程序。如果您找不到 Google Go 的其他方案,请尝试在 C++ 中搜索相同类型的方案,它们通常非常相似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多