一、每个 Go 程序都是由包构成的。
工作空间内基本目录
--src
--pkg
--bin
在src下的源目录下的代码是以包形式组织的,编译后安装可以把包安装到pkg,入口包可以生成二进制文件到bin下面。
编译时的依赖查找默认路径就是工作空间src和pkg以及GOROOT下相应目录。
二、模块(包依赖管理)1.11后提供 go mod 包依赖管理工具,go.mod是每个包内的配置文件。
当利用go get 获取包时,会根据go.mod下载依赖
环境变量配置:
export GOPROXY=https://goproxy.io-----解决墙的问题
export GO111MODULE=on----------------解决依赖下载的问题
历史原因:
网络原因无法下载谷歌下的包,当从git下载到本地时,目录名称跟实际发布包路径不一致,所以需要修改
go mod的出现解决了这个问题。
程序从 main 包开始运行。
本程序通过导入路径 "fmt" 和 "math/rand" 来使用这两个包。
按照约定,包名与导入路径的最后一个元素一致。
例如,"math/rand" 包中的源码均以 package rand 语句开始。
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}
三、自定义包/库
1、创建一个程序
$ mkdir $GOPATH/src/github.com/user/hello
package main import "fmt" func main() { fmt.Printf("Hello, world. ") }
$ go install github.com/user/hello
注意,你可以在系统的任何地方运行此命令。go
工具会根据 GOPATH
指定的工作空间,在 github.com/user/hello
包内查找源码。
若在从包目录中运行 go install
,也可以省略包路径:
$ cd $GOPATH/src/github.com/user/hello $ go install
2、创建一个库
$ mkdir $GOPATH/src/github.com/user/stringutil
接着,在该目录中创建名为 reverse.go
的文件,内容如下:
// stringutil 包含有用于处理字符串的工具函数。 package stringutil // Reverse 将其实参字符串以符文为单位左右反转。 func Reverse(s string) string { r := []rune(s) for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { r[i], r[j] = r[j], r[i] } return string(r) }
现在用 go build
命令来测试该包的编译:
$ go build github.com/user/stringutil
当然,若你在该包的源码目录中,只需执行:
$ go build
3、使用库
确认 stringutil
包构建完毕后,修改原来的 hello.go
文件(它位于 $GOPATH/src/github.com/user/hello
)去使用它:
package main import ( "fmt" "github.com/user/stringutil"--------代码中package关键字 ) func main() { fmt.Printf(stringutil.Reverse("!oG ,olleH"))---代码中package关键字,会去找到合适的文件依赖 }
无论是安装包还是二进制文件,go
工具都会安装它所依赖的任何东西。 因此当我们通过
$ go install github.com/user/hello
来安装hello
程序时,stringutil
包也会被自动安装。
四、包名
包名
Go源文件中的第一个语句必须是
package 名称
这里的 名称
即为导入该包时使用的默认名称。 (一个包中的所有文件都必须使用相同的 名称
。)
Go的约定是包名为导入路径的最后一个元素:作为 “crypto/rot13
” 导入的包应命名为 rot13
。
可执行命令必须使用 package main
。
链接成单个二进制文件的所有包,其包名无需是唯一的,只有导入路径(它们的完整文件名) 才是唯一的。
共多关于Go的命名约定见 实效Go编程。