一、Go的源码文件
Go 的源码文件分类:
如上图,分为三类:
1、命令源码文件:
声明自己属于 main 代码包、包含无参数声明和结果声明的 main 函数。
命令源码文件被安装以后,GOPATH 如果只有一个工作区,那么相应的可执行文件会被存放当前工作区的 bin 文件夹下;如果有多个工作区,就会安装到 GOBIN 指向的目录下。
命令源码文件是 Go 程序的入口。
同一个代码包中最好也不要放多个命令源码文件。多个命令源码文件虽然可以分开单独 go run 运行起来,但是无法通过 go build 和 go install。
我们先打开上次课的hello目录,然后复制helloworld.go为helloworld2.go文件,并修改里面的内容:
package main
import "fmt"
func main(){
fmt.Println("我是第二个helloworld文件")
fmt.Print("Go Go Go !!!")
}
hello目录下有两个go文件了,一个是helloworld.go,一个是helloworld2.go。先说明一下,在上述文件夹中放了两个命令源码文件,同时都声明自己属于 main 代码包。
打开终端,进入hello这个目录,也可以看到这两个文件:
localhost:~ ruby cd go/src/hello
localhost:hello ruby ls
helloworld.go helloworld2.go
然后我们分别执行go run命令,可以看到两个go文件都可以被执行:
localhost:hello ruby$ go run helloworld.go
HelloWorld
Go Go Go !!!localhost:hello ruby$ go run helloworld2.go
我是第二个helloworld文件
Go Go Go !!!
接下来执行 go build 和 go install ,看看会发生什么:
localhost:hello ruby$ go build
# hello
./helloworld2.go:3:6: main redeclared in this block
previous declaration at ./helloworld.go:3:6
localhost:hello ruby$ go install
# hello
./helloworld2.go:3:6: main redeclared in this block
previous declaration at ./helloworld.go:3:6
localhost:hello ruby$
运行效果图:
这也就证明了多个命令源码文件虽然可以分开单独 go run 运行起来,但是无法通过 go build 和 go install。
同理,如果命令源码文件和库源码文件也会出现这样的问题,库源码文件不能通过 go build 和 go install 这种常规的方法编译和安装。具体例子和上述类似,这里就不再贴代码了。
所以命令源码文件应该是被单独放在一个代码包中。
2、库源码文件
库源码文件就是不具备命令源码文件上述两个特征的源码文件。存在于某个代码包中的普通的源码文件。
库源码文件被安装后,相应的归档文件(.a 文件)会被存放到当前工作区的 pkg 的平台相关目录下。
3、测试源码文件
名称以 _test.go 为后缀的代码文件,并且必须包含 Test 或者 Benchmark 名称前缀的函数:
func TestXXX( t *testing.T) {
}
名称以 Test 为名称前缀的函数,只能接受 *testing.T 的参数,这种测试函数是功能测试函数。
func BenchmarkXXX( b *testing.B) {
}
名称以 Benchmark 为名称前缀的函数,只能接受 *testing.B 的参数,这种测试函数是性能测试函数。
现在答案就很明显了:
命令源码文件是可以单独运行的。可以使用 go run 命令直接运行,也可以通过 go build 或 go install 命令得到相应的可执行文件。所以命令源码文件是可以在机器的任何目录下运行的。
举个栗子:
比如平时我们在 LeetCode 上刷算法题,这时候写的就是一个程序,这就是命令源码文件,可以在电脑的任意一个文件夹新建一个 go 文件就可以开始刷题了,写完就可以运行,对比执行结果,答案对了就可以提交代码。
但是公司项目里面的代码就不能这样了,只能存放在 GOPATH 目录下。因为公司项目不可能只有命令源码文件的,肯定是包含库源码文件,甚至包含测试源码文件的。
二、Go的命令
目前Go的最新版1.12里面基本命令有以下17个。
我们可以打开终端输入:go help即可看到Go的这些命令以及简介。
bug start a bug report
build compile packages and dependencies
clean remove object files and cached files
doc show documentation for package or symbol
env print Go environment information
fix update packages to use new APIs
fmt gofmt (reformat) package sources
generate generate Go files by processing source
get download and install packages and dependencies
install compile and install packages and dependencies
list list packages or modules
mod module maintenance
run