Golang中如何使用Gopath外的包

Golang中如何使用Gopath外的包 大家好,

我可能遗漏了一些非常简单基础的东西,但依然没想明白问题所在。

我在Go路径外创建了一个go-mod文件夹,其中包含main.go文件和一个名为hello的文件夹,hello文件夹内包含world.go文件。

  • go-mod – main.go – hello — world.go

当我尝试执行:

func main() {
    hello.World()
}

程序无法找到"hello"包。导入功能也不起作用(在Go路径下导入语句import "gitlab.intra/agrechka/go-mod/hello"本应正常运作)。

执行go mod initgo mod tidy命令后问题仍未解决。

运行环境:MacOS,Go v1.11

感谢帮助!


更多关于Golang中如何使用Gopath外的包的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

关键在于导入符号的使用,之前没有见过或使用过"./…"这种写法。非常感谢!

更多关于Golang中如何使用Gopath外的包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 Artem,

我刚才试了一下,这个方法对我有效。无论是将 GOPATH 设置为完全不同的目录(位于 go-mod 所在目录树之外),还是完全不设置 GOPATH,都能正常工作。我使用的是 Linux 系统上的 Go 1.11。

在文件 main.go 中:

package main

import "./hello"

func main() {
        hello.World()
}

在文件 hello/world.go 中:

package hello

import "fmt"

func World() {
        fmt.Printf("hello, world\n")
}

$ go run main.go
hello, world
$ go build main.go
$ ./main
hello, world

在你的情况下,问题可能源于 Go 模块未正确初始化或导入路径不匹配。Go 1.11 引入了模块支持,但需要确保模块设置正确。以下是步骤和示例代码来解决这个问题。

首先,确认你的项目结构如下:

go-mod/
├── main.go
└── hello/
    └── world.go
  1. 初始化 Go 模块:在 go-mod 目录下运行 go mod init 命令,指定一个模块路径。例如,如果你使用 GitLab 仓库,可以这样初始化:

    cd go-mod
    go mod init gitlab.intra/agrechka/go-mod
    

    这会创建一个 go.mod 文件,定义模块路径。

  2. 编写包代码:在 hello/world.go 文件中,定义一个包并导出函数。确保包名与导入路径一致。例如:

    // hello/world.go
    package hello
    
    import "fmt"
    
    func World() {
        fmt.Println("Hello, World!")
    }
    

    这里,包名是 hello,与目录名一致。

  3. 在 main.go 中导入和使用包:在 main.go 中,使用模块路径导入 hello 包。导入路径应为模块路径加上子目录路径。例如:

    // main.go
    package main
    
    import "gitlab.intra/agrechka/go-mod/hello"
    
    func main() {
        hello.World()
    }
    

    这里,导入路径是 gitlab.intra/agrechka/go-mod/hello,对应 hello 目录。

  4. 运行 Go 工具命令:执行 go mod tidy 来解析依赖并更新 go.mod 文件。然后运行程序:

    go mod tidy
    go run main.go
    

    如果一切正确,输出应为:Hello, World!

如果问题仍然存在,检查以下点:

  • 确保 go.mod 文件中的模块路径与导入路径匹配。例如,如果 go.mod 包含 module gitlab.intra/agrechka/go-mod,那么导入必须是 gitlab.intra/agrechka/go-mod/hello
  • 验证 Go 版本:Go 1.11 是早期模块版本,可能存在兼容性问题。考虑升级到更新版本(如 Go 1.16+),但根据你的描述,Go 1.11 应支持基本模块功能。
  • 检查文件权限和路径大小写:在 MacOS 上,确保路径大小写一致,因为 Go 对导入路径大小写敏感。

如果导入路径是本地且未推送到远程仓库,Go 模块可能无法解析。在这种情况下,你可以使用 replace 指令在 go.mod 中指定本地路径,但根据你的结构,直接使用模块路径应能工作。

示例 go.mod 文件内容:

module gitlab.intra/agrechka/go-mod

go 1.11

通过以上步骤,你的程序应该能正确找到并使用 hello 包。如果错误持续,请提供具体的错误消息以便进一步诊断。

回到顶部