使用不同的包和文件夹名称

使用文件夹名称以外的包名称是完全正常的。如果我们这样做,我们仍然必须根据目录结构导入包,但是在导入之后我们必须通过我们在 package 子句中使用的名称来引用它。

例如,如果你有一个文件夹 $GOPATH/src/mypck,在其中我们有一个文件 a.go

package apple

const Pi = 3.14

使用这个包:

package main

import (
    "mypck"
    "fmt"
)

func main() {
    fmt.Println(apple.Pi)
}

尽管这有效,但你应该有充分的理由将包名称与文件夹名称分开(或者它可能成为误解和混淆的根源)。

有什么用?

简单。包名称是 Go idetifier

identifier = letter { letter | unicode_digit } .

这允许在标识符中使用 unicode 字母,例如αβ是 Go 中的有效标识符。Go 不是处理文件夹和文件名,而是由操作系统处理,不同的文件系统有不同的限制。实际上有许多文件系统不允许所有有效的 Go 标识符作为文件夹名称,因此你无法将软件包命名为语言规范允许的内容。

可以选择使用与其包含文件夹不同的软件包名称,你可以选择真正命名软件包规范允许的软件包,无论底层操作和文件系统如何。