Go语言中包名与文件夹命名的标准规则

发表时间: 2024-05-14 10:08

golang包名必须与所在文件夹同名吗?

不必须, 但是同个目录中(不含子目录)的所有文件包名必须一致, 通常为了方便包定位, 建议包名和目录名一致, 否则你import "A", 使用起来B.xxx, 看上去不统一, 不能一眼看出来这个B包是哪个文件的

重要结论: 目录名和包名建议一致;

> # pwd/data/relation

实例一:

> # go mod init relation
> #tree.├── go.mod├── main.go└── test└── test.go

test/test.go

package testimport "fmt"func init(){    fmt.Println("test.go init() is called")}func Test(){    fmt.Println("test.go test() is called")}

main.go

package main //必须有个main包import(    "fmt"    "relation/test" //加载的是package 定义的包名)func main(){    fmt.Println("main.go main() is called")    test.Test()}
> # go run main.gotest.go init() is calledmain.go main() is calledtest.go test() is called

实例二: 修改文件夹名称

> # mv test ceshi

修改 import 导入的路径

方式一:

> # vim main.go
package main //必须有个main包import(    "fmt"    "relation/ceshi" //加载的导入路径)func main(){    fmt.Println("main.go main() is called")    test.Test() // 这里 test 能够正确找到包 test 为 "package test" 定义的包名}
> # go run main.gotest.go init() is calledmain.go main() is calledtest.go test() is called

方式二: protobuf 经常使用的方式

> # vim main.go
package main //必须有个main包import (    "fmt"    shiyan "relation/ceshi" // 加载的是导入的路径, 使用别名)func main() {    fmt.Println("main.go main() is called")    shiyan.Test() // 这里 shiyan(别名) 能够正确找到 Test() 方法}
> # go run main.gotest.go init() is calledmain.go main() is calledtest.go test() is called

注意: 这就用于解释 .proto 文件, 定义的 option go_package = ".;greet"; 包名可以随意变换; 而定义的方法 通过 "别名" 可以随意调用 test.go 文件定义的变量、结构体、方法


实例三: 在ceshi文件加入其它包名

> # cd ceshi> # vim calc.go
package calcfunc Add(a, b int) int{    return a + b}func Minus(a, b int) int{    return a - b}func Multiply(a, b int) int{    return a * b}func Divide(a, b int) int{    return a / b}
> # cd ..> # go run main.gomain.go:4:2: found packages calc (calc.go) and test (test.go) in /data/relation/ceshi

此时就出现问题, 同一目录下, 不能有两个不同的包(package 定义的包名)

解决方法:

> # cd ceshi> # vim calc.go   修改包名的名称 将 calc 修改为 test
package testfunc Add(a, b int) int{    return a + b}func Minus(a, b int) int{    return a - b}func Multiply(a, b int) int{    return a * b}func Divide(a, b int) int{    return a / b}

再次运行

> # cd ..> # go run main.gotest.go init() is calledmain.go main() is calledtest.go test() is called

实例四:

规范的做法: 包名与文件夹的名称保持一致

> # mv ceshi test

修改 import 导入的路径

> # main.go
package main //必须有个main包import ("fmt""relation/test" // 加载的是导入的路径)func main() {fmt.Println("main.go main() is called")test.Test()}
> # go run main.gotest.go init() is calledmain.go main() is calledtest.go test() is called
> # tree.├── test│   ├── calc.go│   └── test.go├── go.mod└── main.go1 directory, 4 files