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