【问题标题】:Import local package with a package name different than the file name [closed]导入包名与文件名不同的本地包[关闭]
【发布时间】:2021-05-15 02:29:13
【问题描述】:

我有一个具有这种结构的 Go 项目

src/
    main.go (package main.go)
    www/
        api.go (package apictrl)
        url_mapping.go (package apictrl)
    core/
        model.go (package mlsnd)

当我使用 Visual Studio Code 和 WSL Debian 进行编码时,我在 main.go 文件中写入 apictrl.StartRouter() 时收到错误 undefined: apictrl

我尝试了以下方法:

  •    import (
              "../www"
      )
    
  •   import (
              "../www/apictrl"
      )
    
  •   import (
              "../apictrl"
      )
    
  •   import (
              "/mnt/c/Users/myusername/path/toproject/src/apictrl"
      )
    
  •   import (
              "/mnt/c/Users/myusername/path/toproject/src/www/apictrl"
      )
    
  •   import (
              "/mnt/c/Users/myusername/path/toproject/src/www"
      )
    

正如我在这篇帖子中看到的 Import package & type 但它们都不起作用。

【问题讨论】:

  • 您的每一个导入示例都是无效的。 ../www 是无效的导入路径。 Go does not support relative imports。以/mnt 开头的路径不起作用,因为 Go 需要一个以主机名开头的导入路径,而不是文件路径。
  • 关于你的问题的标题,这似乎是一个红鲱鱼。包的名称与文件名完全无关。按照惯例,包的名称与包含它的目录的名称相同,但这不是硬性规定。
  • GitHub/GitLab 是入门的简单方法。但是您可以在任何地方托管它 - 或不去任何地方。如果您无处托管它,您将只能在同一个项目中使用它(在许多情况下完全可以),但您仍然需要在您的go.mod 中给它一个适当的名称。如果您确定永远不会在某个地方托管它,您可以使用像 local.local 这样的主机名。
  • "请注意,您无需将代码发布到远程存储库即可构建它。模块可以在本地定义而不属于存储库。但是,组织是一个好习惯你的代码就像你有一天会发布一样。” “如何编写 Go 代码”的第一段之一。真的,读它。

标签: go visual-studio-code package windows-subsystem-for-linux


【解决方案1】:

正如评论所指出的,我找到了解决方案:

首先,我必须将所有文件夹重命名为它们包含的包的名称

src/
    main/
        main.go (package main)
    apictrl/
        api.go (package apictrl)
    mlsnd/
        model.go (package mlsnd)

在 main.go 中,我必须使用 go.mod 中为模块指定的名称导入想要的包(使用 go mod init package.name 创建)

import (
    "package.name/src/apictrl"
) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 2012-02-14
    • 2014-08-20
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多