每個(gè) Go 文件都屬于且僅屬于一個(gè)包,一個(gè)包可以由許多以 .go 為擴(kuò)展名的源文件組成,因此文件名和包名一般來說都是不相同的。
你必須在源文件中非注釋的第一行指明這個(gè)文件屬于哪個(gè)包,如:
package main
1、main包
每個(gè)Go應(yīng)用程序都包含一個(gè)名為main的包,main包下可以有多個(gè)文件,但所有文件中只能有一個(gè)main() 方法,main()方法代表程序入口。
一個(gè)應(yīng)用程序可以包含不同的包,而且即使你只使用main包也不必把所有的代碼都寫在一個(gè)文件里:你可以用一些較小的文件,并且在每個(gè)文件第一行都使用package main來指明這些文件都屬于main包。
如果你打算編譯包名不是為main的源文件,如pack1,編譯后產(chǎn)生的對象文件將會(huì)是pack1.a,而不是可執(zhí)行程序。另外要注意的是,所有的包名都應(yīng)該使用小寫字母。
2、標(biāo)準(zhǔn)庫
Go程序自帶的包合起來成為Go的標(biāo)準(zhǔn)庫,前面我們用過fmt、os、net/http、strconv,除此之外還有如下常見的包:
| 包名 | 說明 |
| bufio | 帶緩沖的 I/O 操作 |
| bytes | 實(shí)現(xiàn)字節(jié)操作 |
| container | 封裝堆、列表和環(huán)形列表等容器 |
| crypto | 加密算法 |
| database | 數(shù)據(jù)庫驅(qū)動(dòng)和接口 |
| debug | 各種調(diào)試文件格式訪問及調(diào)試功能 |
| encoding | 常見算法如 JSON、XML、Base64 等 |
| flag | 命令行解析 |
| html | HTML 轉(zhuǎn)義及模板系統(tǒng) |
| image | 常見圖形格式的訪問及生成 |
| io | 實(shí)現(xiàn) I/O 原始訪問接口及訪問封裝 |
| math | 數(shù)學(xué)庫 |
| net | 網(wǎng)絡(luò)庫,支持 Socket、HTTP、郵件、RPC、SMTP 等 |
| path | 兼容各操作系統(tǒng)的路徑操作實(shí)用函數(shù) |
| plugin | 支持將代碼編譯為插件,按需加載 |
| reflect | 語言反射支持??梢詣?dòng)態(tài)獲得代碼中的類型信息,獲取和修改變量的值 |
| regexp | 正則表達(dá)式封裝 |
| runtime | 運(yùn)行時(shí)接口 |
| sort | 排序接口 |
| strings | 字符串轉(zhuǎn)換、解析及實(shí)用函數(shù) |
| time | 時(shí)間接口 |
| text | 文本模板及 Token 詞法器 |
標(biāo)準(zhǔn)庫里的包,只需要在go程序里import后,就可以調(diào)用了。
3、自定義包
假定我們有兩個(gè)包:aming和linux,下面來演示如何在aming包中導(dǎo)入linux包
1)兩個(gè)包屬于同一個(gè)項(xiàng)目
在這里,“項(xiàng)目”理解成就是一個(gè)目錄(aming),在這個(gè)目錄下還有一個(gè)子目錄(linux),這個(gè)linux也就是要被導(dǎo)入的包
目錄結(jié)構(gòu)為:
aming/ ├── linux │ └── linux.go └── aming.go
先來定義linux包程序
mkdir -p aming/linux
cdaming/linux
cat > linux.go << EOF
package linux
//定義變量,變量名頭字母大寫,可以在外部調(diào)用
var Name = "linux"
//函數(shù)名 頭字母大寫,表示該函數(shù)可以被其它程序調(diào)用
func Sum(n1, n2 int) int {
return n1 + n2
}
func Sub(n1, n2 int) int {
return n1 - n2
}
func Mul(n1, n2 int) int {
return n1 * n2
}
func Div(n1, n2 int) int {
return n1 / n2
}
EOF
初始化module
cd .. go mod init aming ##包的名字為aming
調(diào)用linux包
cat > aming.go << EOF
package main
import (
"fmt"
"aming/linux"
)
func main() {
total := linux.Sum(3, 5)
fmt.Println("3和5相加等于", total)
fmt.Println("10除以2等于", linux.Div(10, 2))
fmt.Println("Name is:", linux.Name)
}
EOF
編譯
go build
會(huì)在當(dāng)前目錄里生成可執(zhí)行文件aming
執(zhí)行

2)兩個(gè)包為兩個(gè)項(xiàng)目
目錄結(jié)構(gòu)為:
├── aming
│ └── aming.go
└── linux
└── linux.go
先來定義linux包程序
mkdir -p aming linux
cat > linux/linux.go << EOF
package linux
//定義變量,變量名頭字母大寫,可以在外部調(diào)用
var Name = "linux"
//函數(shù)名 頭字母大寫,表示該函數(shù)可以被其它程序調(diào)用
func Sum(n1, n2 int) int {
return n1 + n2
}
func Sub(n1, n2 int) int {
return n1 - n2
}
func Mul(n1, n2 int) int {
return n1 * n2
}
func Div(n1, n2 int) int {
return n1 / n2
}
EOF
定義主程序
cat > aming.go << EOF
package main
import?(
"fmt"
"linux"
)
func main() {
total := linux.Sum(3, 5)
fmt.Println("3和5相加等于", total)
fmt.Println("10除以2等于", linux.Div(10, 2))
fmt.Println("Name is:", linux.Name)
}
EOF
此時(shí)運(yùn)行程序會(huì)報(bào)錯(cuò)
go run aming.go aming.go:5:3: package linux is not in GOROOT (/opt/go/src/linux)
它會(huì)默認(rèn)到$GOROOT下去找linux包,要解決此問題,可以將linux目錄直接挪到$GOROOT下
mv ../linux /opt/go/src/
再次執(zhí)行程序,正常
go run aming/aming.go 3和5相加等于8 10除以2等于5 Name is: linux
如果不想將linux目錄挪到$GOROOT下,還有一種方法,定義go.mod即可,主要目的是為了讓aming.go找到linux包
先把linux目錄挪回來(注意,當(dāng)前還是在aming目錄里)
mv /opt/go/src/linux ../
初始化module
go mod init aming
到linux目錄下,也要初始化module
cd linux go mod init linux
然后編輯aming目錄下的go.mod,改為
module aming go1.20 require"linux"v0.0.0 replace "linux" => "../linux"
說明:require定義要依賴的包,replace定義該包在什么位置。
審核編輯:劉清
-
RPC
+關(guān)注
關(guān)注
0文章
113瀏覽量
12155 -
HTML
+關(guān)注
關(guān)注
0文章
280瀏覽量
45429 -
SMTP協(xié)議
+關(guān)注
關(guān)注
0文章
7瀏覽量
6828 -
go語言
+關(guān)注
關(guān)注
1文章
159瀏覽量
9562
原文標(biāo)題:Go語言中的包
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄

Go語言中的包
評論