第009节:Go的执行原理以及Go的命令(上)

一、Go的源码文件


Go 的源码文件分类:

第009节:Go的执行原理以及Go的命令(上) 如上图,分为三类:

1、命令源码文件:

声明自己属于 main 代码包、包含无参数声明和结果声明的 main 函数。

命令源码文件被安装以后,GOPATH 如果只有一个工作区,那么相应的可执行文件会被存放当前工作区的 bin 文件夹下;如果有多个工作区,就会安装到 GOBIN 指向的目录下。

命令源码文件是 Go 程序的入口。

同一个代码包中最好也不要放多个命令源码文件。多个命令源码文件虽然可以分开单独 go run 运行起来,但是无法通过 go build 和 go install。

我们先打开上次课的hello目录,然后复制helloworld.go为helloworld2.go文件,并修改里面的内容:

package mainimport "fmt"func main(){
    fmt.Println("我是第二个helloworld文件")
    fmt.Print("Go Go Go !!!")}

hello目录下有两个go文件了,一个是helloworld.go,一个是helloworld2.go。先说明一下,在上述文件夹中放了两个命令源码文件,同时都声明自己属于 main 代码包。

打开终端,进入hello这个目录,也可以看到这两个文件:

localhost:~ ruby cd go/src/hellolocalhost:hello ruby lshelloworld.go   helloworld2.go

然后我们分别执行go run命令,可以看到两个go文件都可以被执行:

localhost:hello ruby$ go run helloworld.goHelloWorldGo 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:6localhost:hello ruby$ go install# hello./helloworld2.go:3:6: main redeclared in this block
    previous declaration at ./helloworld.go:3:6localhost:hello ruby$ COPY

运行效果图:

这也就证明了多个命令源码文件虽然可以分开单独 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 目录下。因为公司项目不可能只有命令源码文件的,肯定是包含库源码文件,甚至包含测试源码文件的。

(0)

相关推荐