Skip to content

包的导入路径决定代码怎么引用包,标识符的首字母决定它对外是否可见,两者一起控制包之间的依赖关系。

1. 包的导入路径 ​

概念 ​

  • 导入路径:导入路径是用来引用和访问 Go 包的唯一标识符,指向包所在的目录。
  • 标准库包:Go 标准库中的包可以通过预定义的导入路径进行引用,例如 fmt、os、net/http 等。
  • 第三方包:第三方包通常通过模块路径进行引用,例如 github.com/some/package。
  • 本地包:项目中的本地包通过模块路径导入,例如本项目 go.mod 中声明的模块名为 myapp,则 utils 包的导入路径是 myapp/utils(注意:Go 模块模式不支持 ./mypackage 这样的相对导入路径)。

示例 ​

假设你的项目目录结构如下:

myapp/
├── go.mod
├── main.go
└── utils/
    └── helper.go

main.go 文件:

go
package main

import (
    "fmt"
    "myapp/utils" // 导入本地包
)

func main() {
    fmt.Println(utils.Greet())
}

utils/helper.go 文件:

go
package utils

func Greet() string {
    return "Hello from utils!"
}

在这个示例中,main.go 使用 import "myapp/utils" 来导入 utils 包,utils 包中的 Greet 函数被 main 包调用。

2. 包的可见性 ​

概念 ​

  • 可见性:包的可见性指的是在包外部是否可以访问包中的标识符(变量、函数、类型等)。Go 使用标识符的首字母来决定其可见性。
  • 公共标识符:以大写字母开头的标识符对外部包可见。例如,Greet 函数是公共的。
  • 私有标识符:以小写字母开头的标识符对外部包不可见。例如,greetHelper 函数是私有的。

示例 ​

考虑以下两个包:

utils/helper.go 文件:

go
package utils

// Public function
func Greet() string {
    return "Hello from utils!"
}

// Private function
func greetHelper() string {
    return "This is a helper function."
}

main.go 文件:

go
package main

import (
    "fmt"
    "myapp/utils"
)

func main() {
    fmt.Println(utils.Greet()) // 可以访问
    // fmt.Println(utils.greetHelper()) // 编译错误:不可访问
}

在这个示例中:

  • utils.Greet 函数可以在 main 包中访问,因为它的首字母是大写的,表示它是公共的。
  • utils.greetHelper 函数不能在 main 包中访问,因为它的首字母是小写的,表示它是私有的。

3. 包的导入路径和可见性管理 ​

包的导入路径 ​

  • 模块路径:推荐使用模块路径进行包的导入,例如 github.com/user/project/package。模块路径可以在 go.mod 文件中定义。
  • 相对路径:Go 模块模式不支持 ./ 或 ../ 这样的相对导入路径,直接使用会报错 relative import paths are not supported in module mode,必须改用模块路径。

包的可见性控制 ​

相关的标识符放同一个包里,对外只暴露大写的,小写的留作包内实现,包的对外接口就由导出名控制。

4. go.mod 文件中的包管理 ​

go.mod 文件中定义了模块的路径和依赖项。例如:

go.mod 文件:

go
module myapp

go 1.20

require (
    github.com/some/dependency v1.2.3
)

go.mod 记录项目需要的依赖及其版本。

总结 ​

  • 包的导入路径:标准库直接写包名,第三方包和本地包用 go.mod 里声明的模块路径接目录,相对路径不支持。
  • 包的可见性:大写开头的标识符导出到包外,小写开头的留在包内。

参考资料 ​

同层页面 ​

相关页面 ​

Hello Golang