每個 Go 文件都屬于且僅屬于一個包,一個包可以由許多以 .go 為擴展名的源文件組成,因此文件名和包名一般來說都是不相同的。
你必須在源文件中非注釋的第一行指明這個文件屬于哪個包,如:
package main
1、main包
每個Go應用程序都包含一個名為main的包,main包下可以有多個文件,但所有文件中只能有一個main() 方法,main()方法代表程序入口。
一個應用程序可以包含不同的包,而且即使你只使用main包也不必把所有的代碼都寫在一個文件里:你可以用一些較小的文件,并且在每個文件第一行都使用package main來指明這些文件都屬于main包。
如果你打算編譯包名不是為main的源文件,如pack1,編譯后產生的對象文件將會是pack1.a,而不是可執行程序。另外要注意的是,所有的包名都應該使用小寫字母。
2、標準庫
Go程序自帶的包合起來成為Go的標準庫,前面我們用過fmt、os、net/http、strconv,除此之外還有如下常見的包:
包名 | 說明 |
bufio | 帶緩沖的 I/O 操作 |
bytes | 實現字節操作 |
container | 封裝堆、列表和環形列表等容器 |
crypto | 加密算法 |
database | 數據庫驅動和接口 |
debug | 各種調試文件格式訪問及調試功能 |
encoding | 常見算法如 JSON、XML、Base64 等 |
flag | 命令行解析 |
html | HTML 轉義及模板系統 |
image | 常見圖形格式的訪問及生成 |
io | 實現 I/O 原始訪問接口及訪問封裝 |
math | 數學庫 |
net | 網絡庫,支持 Socket、HTTP、郵件、RPC、SMTP 等 |
path | 兼容各操作系統的路徑操作實用函數 |
plugin | 支持將代碼編譯為插件,按需加載 |
reflect | 語言反射支持??梢詣討B獲得代碼中的類型信息,獲取和修改變量的值 |
regexp | 正則表達式封裝 |
runtime | 運行時接口 |
sort | 排序接口 |
strings | 字符串轉換、解析及實用函數 |
time | 時間接口 |
text | 文本模板及 Token 詞法器 |
標準庫里的包,只需要在go程序里import后,就可以調用了。
3、自定義包
假定我們有兩個包:aming和linux,下面來演示如何在aming包中導入linux包
1)兩個包屬于同一個項目
在這里,“項目”理解成就是一個目錄(aming),在這個目錄下還有一個子目錄(linux),這個linux也就是要被導入的包
目錄結構為:
aming/ ├── linux │ └── linux.go └── aming.go
先來定義linux包程序
mkdir -p aming/linux cdaming/linux cat > linux.go << EOF package linux //定義變量,變量名頭字母大寫,可以在外部調用 var Name = "linux" //函數名 頭字母大寫,表示該函數可以被其它程序調用 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
調用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
會在當前目錄里生成可執行文件aming
執行
2)兩個包為兩個項目
目錄結構為:
├── aming │ └── aming.go └── linux └── linux.go
先來定義linux包程序
mkdir -p aming linux cat > linux/linux.go << EOF package linux //定義變量,變量名頭字母大寫,可以在外部調用 var Name = "linux" //函數名 頭字母大寫,表示該函數可以被其它程序調用 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
此時運行程序會報錯
go run aming.go aming.go:5:3: package linux is not in GOROOT (/opt/go/src/linux)
它會默認到$GOROOT下去找linux包,要解決此問題,可以將linux目錄直接挪到$GOROOT下
mv ../linux /opt/go/src/
再次執行程序,正常
go run aming/aming.go 3和5相加等于8 10除以2等于5 Name is: linux
如果不想將linux目錄挪到$GOROOT下,還有一種方法,定義go.mod即可,主要目的是為了讓aming.go找到linux包
先把linux目錄挪回來(注意,當前還是在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
+關注
關注
0文章
111瀏覽量
11540 -
HTML
+關注
關注
0文章
278瀏覽量
35783 -
SMTP協議
+關注
關注
0文章
7瀏覽量
6611 -
go語言
+關注
關注
1文章
158瀏覽量
9053
原文標題:Go語言中的包
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論