目录结构

假设我们有以下的目录结构:

project/
│
├── puzzlers/
│   └── article3/
│       └── q2/
│           ├── lib/
│           │   └── demo5_lib.go
│           └── main.go

文件内容

1. demo5_lib.go (位于 puzzlers/article3/q2/lib/)

// demo5_lib.go
package lib5 // 包声明为 lib5
 
import "fmt"
 
// Hello 是一个简单的函数,打印一条消息
func Hello() {
    fmt.Println("Hello from lib5!")
}

在这个文件中,虽然我们声明了包名为 lib5,但它实际上位于 lib 目录下。

2. main.go (位于 puzzlers/article3/q2/)

// main.go
package main
 
import (
    "puzzlers/article3/q2/lib" // 导入路径是 lib
)
 
func main() {
    lib.Hello() // 调用 lib5 包中的 Hello 函数
}

解释

  1. 包声明:

    • 在 demo5_lib.go 中,包声明为 package lib5。这意味着在这个文件中定义的所有函数和类型都属于 lib5 包。
  2. 导入路径:

    • 在 main.go 中,我们使用 import "puzzlers/article3/q2/lib" 来导入包。这里的导入路径是基于文件的实际目录结构,而不是包声明的名称。
  3. 调用函数:

    • 在 main.go 中,我们可以通过 lib.Hello() 来调用 demo5_lib.go 中的 Hello 函数。

运行程序

如果我们在 project/puzzlers/article3/q2/ 目录下运行以下命令:

go run main.go

输出结果

Hello from lib5!

总结

  • 导入路径:puzzlers/article3/q2/lib(基于文件的实际位置)
  • 包名:lib5(在文件中声明的名称)

这个例子清楚地展示了包的导入路径和包名之间的区别。在 Go 中,导入路径是基于目录结构的,而包名可以根据开发者的需求进行命名。