N3xtchen 的数字花园

Search

Search IconIcon to open search

Golang-包(Package)

上次更新于 Mar 13, 2023 编辑源文件

# 导入包

这个是我们演示的代码结构:

1
2
3
4
5
6
7
8
9
./test
├── go.mod
├── main.go
├── dir_not_pkg_name
│   └── whatever.go
├── pkg1
│   └── pkg1.go // Echo 方法打印:I am pkg1!
└── pkg2
    └── pkg2.go // Echo 方法打印:I am pkg2!
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// main.go
package main

// 一个个导入
// import "test/pkg1"
// import "test/pkg2"
// import pkg "test/pkg1"

// 一行导入多个包
import ("test/pkg1"; "test/pkg1"; pkg "test/pkg1")

// 批量导入
import (
    "test/pkg1"
    "test/pkg2"
    pkg "test/pkg1"
)

func main() {
    pkg1.Echo()
    pkg2.Echo()
    pkg.Echo()
}

// 下面是 go run main.go 的输出结果
// I am pkg1!
// I am pkg2!
// I am pkg1!

注意

  1. 包名需要使用引号(")包围,很多其他语言都没有,比如 PythonJava;
  2. 避免重名或者方便调用,可以使用别名;
  3. 一行导入多个包的 (); 都不可省略

# 包名和目录名不一致

声明:不建议包名和包所在的目录名不一致!

test/dir_not_pkg_name/whatever.go 代码如下:

1
2
3
4
5
6
7
package another_pkg

import "fmt"

func Echo() {
	fmt.Println("Hi!")
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// main.go
package main

import "test/dir_not_pkg_name"

func main() {
	another_pkg.Echo();  // 编译成功后,执行输出 Hi
	
	//dir_not_pkg_name.Echo() 
	// 变异报错:./main.go:11:5: undefined: dir_not_pkg_name
}

# 不支持相对路径,

golang 不支持相对路径的导入,利大于弊

1
2
3
4
// main.go
package main

import "./pkg1"

编译的时候,会报如下错误:

1
2
go build main.go
main.go:3:8: "./pkg1" is relative, but relative import paths are not supported in module mode

A beginners guide to Packages in Golang | CalliCoder