刚听了字节后端训练营的Go基础课,我跃跃欲试,磨拳擦掌直接就开始创建属于我自己的Go项目。
mkdir myproject && cd myproject
go mod init myproject
此时我的项目已经创建好了,可以看到孤零零的myproject文件夹下,躺着一个名叫go.mod的文件。这个文件声明了我们当前项目的名称为myproject然后是我们使用了什么版本的go。在我这是1.20
然后我创建我第一个go文件
vim main.go
然后在main.go文件中,我一顿敲,一个helloworld程序诞生了
package main
import "fmt"
func main(){
fmt.Println("Hello World")
}
快速的运行一下
go run main.go
成功输出Hello World
接下来学到了函数,我决定封装一个函数来打印hello
func printHello(name string){
fmt.Printf("Hello %s", name)
}
然后把main函数修改为
func main(){
printHello("Juejin")
}
运行一下试试,成功,输出Hello Juejin
然后我了解到go语言是按包来组织的,只要package xxx是一样的,互相之间就认为在同一个包里,可以互相访问,于是我把printHello函数单独拿出来放到一个functional.go文件中,并把main.go中的声明删除
// functional.go
package main
import "fmt"
func printHello(name string){
fmt.Printf("Hello %s", name)
}
// main.go
package main
func main(){
printHello("Juejin")
}
然后我再运行一下,go run main.go
咦,怎么报错了,我的printHello呢???
为了验证我是否写错了,我运行go build 打包试了一下,结果成功的打出了可运行的文件。
所以问题就出现在这个go run main.go上
看来直接go run main.go,除了会找main.go中依赖的文件之外,不会去加载当前目录下同样是main包的代码,要想成功运行的话,应该这样做
go run main.go functional.go
并且这两个文件的顺序也不重要,由此我猜测,go run 后面的文件列表只是给go运行添加一个入口,通过这些入口和其引用的文件,找到所有的库和代码。然后寻找其中名为main的包下的main方法,运行它。
因此可以知道一个go程序运行必备的特征有
-
package main
-
func main
本文章用来记录这个奇怪的现象,以及自己的分析与猜测。