1. 如何组织 Go 代码
包(packages)%GOROOT%\srcnet
模块(module)go.mod模块路径(module path)
导入路径(import path)
google.golang.org/grpcgoogle.golang.org/grpc/examples
golang.org/x/toolshttps://golang.org/x/tools%GOPATH%\pkg\modgo clean -modcache
go getgo get github.com/gorilla/mux@v1.6.2
github.com/google/go-cmpcmp/github.com/google/go-cmp/cmp
fmtfmt
2. 包命名
fmtlogos

包名只是用于导入的名称,它不需要在所有源代码中都是唯一的,如果真的命名冲突了,用户在导入包时可以选择在本地为导入的包设置一个别名,具体参考本文第 6 章

src/encoding/base64"encoding/base64"base64
3. 包声明
声明语句fmtpackage fmtpackage fmt_testpackage mainmain()
.go包注释
4. 包的导出名
导出的(exported)外部的包fmtPrintf
同一个包

综上所述:

capital letterwithin a packageexported
bufioReaderBufReaderbufio.Readerbufio.Readerio.Reader
5. 包导入
import
%GOROOT%\src%GOPATH%\src%GOPATH%\pkg\modvendor
import "net"import "net/http"import "net/http/httputil"import "github.com/google/go-cmp/cmp"https://github.com/google/go-cmp/cmp%GOPATH%\pkg\mod\github.com\google\go-cmp@v0.4.0
github.com/gin-gonic/gingolang.org/x/net

可以以分组的形式导入多个包:

6. 解决包名冲突
rand

事实上,一个引入声明语句的完整形式为:

其中引入名 importname 是可选的,它的默认值为被引入的包的包名

import . "fmt"
7. 匿名引入

import a package only for its side effects, without any explicit use

init()空白标识符(_)
8. 包的初始化: init 函数
init()
initinit
9. 查看包文档

9.1 go doc 与 godoc

go doc

可以访问 HTML 格式的在线文档:国际官网、国内官网

godoc

启动 Web 服务器:

http://127.0.0.1:6060/

9.2 GoDoc

GoDoc 网站可以为存放在 Github / Bitbucket / Launchpad / Google Project Hosting 等上面的开源 Go 包提供文档查询功能,比如 https://godoc.org/github.com/gorilla/mux

pkg.go.devhttps://pkg.go.dev/github.com/gorilla/mux