包
Go语言是使用包来组织源代码的,包(package)是多个 Go 源码的集合,是一种代码复用方案。Go语言中为我们提供了很多内置包,如 fmt、os、io
等。
任何源代码文件必须属于某个包,同时源码文件的第一行有效代码必须是 package pacakgeName
语句,通过该语句声明自己所在的包。
Go语言没有强制要求包名必须和其所在的目录名同名,但还是建议包名和所在目录同名,这样结构更清晰。
同一个路径下只能存在一个package
,一个package
可以由多个源代码文件组成, package main 包 有且只能由一个main函数
包名的定义是不包括目录路径的,但是包在引用时一般使用全路径引用。比如在GOPATH/src/a/b/
下定义一个包 c
。在包 c
的源码中只需声明为package c
,而不是声明为package a/b/c
,但是在导入 c
包时,需要带上路径,例如import "a/b/c
。
go mod 存在时引入自定义包是以 go mod文件module 名称开头 如module coolcar
引入自定义包"coolcar/proto/gen/go"
Go中如果函数名的首字母大写,表示该函数是公有的,可以被其他程序调用,如果首字母小写,该函数就是是私有的。
包名
包名一般是小写的,使用一个简短且有意义的名称。
包名一般要和所在的目录同名,也可以不同,包名中不能包含-
等特殊符号。
包一般使用域名作为目录名称,这样能保证包名的唯一性,比如 GitHub 项目的包一般会放到GOPATH/src/github.com/userName/projectName
目录下。
包名为 main 的包为应用程序的入口包,编译不包含 main 包的源码文件时不会得到可执行文件。
导入包
import “包的路径”
import 导入语句通常放在源码文件开头包声明语句的下面;
导入的包名需要使用双引号包裹起来;
包名是从GOPATH/src/
后开始计算的,使用/ 进行路径分隔。
// 单行导入
import "包 1 的路径"
import "包 2 的路径"
// 多行导入 多个包 推荐使用多行
import (
"包 1 的路径"
"包 2 的路径"
)
包的导入路径
包的引用路径有两种写法,分别是全路径导入和相对路径导入。
相对路径只能用于导入GOPATH
下的包,标准包的导入只能使用全路径导入。
绝对路径就是GOROOT/src/
或GOPATH/src/
后面包的存放路径。
包的引用格式
使用标准格式引用包,但是代码中却没有使用包,编译器会报错。如果包中有 init
初始化函数,则通过import _ "包的路径"
这种方式引用包,仅执行包的初始化函数,即使包没有 init
初始化函数,也不会引发编译器报错。
package main
// 定义别名
import F "fmt"
func main() {
// 使用别名调用方法
F.Println("import别名")
}
// 省略引用格式
package main
import . "fmt"
func main() {
//不需要加前缀 fmt.
Println("省略引用格式 此种方式不推荐 因为无法识别函数属于那个包")
}
// 匿名引用格式
package main
import (
_ "database/sql"
"fmt"
)
func main() {
fmt.Println("匿名引用格式")
}