任何编程语言都有一个基本的结构,然后有变量、表达式、控制、数据、算法、注释来组合完成某个功能,查看上个章节的 hello world 程序,可以看出各个构成部分:
package 是 go 语言的包,用来组织和分割代码、数据,上面导入的 fmt 包在哪里呢? 移动到 fmt.Println 上鼠标右键或者 F12 使用 go to definition,发现跳转到了一个文件,它的路径是 /usr/local/go/src/fmt/print.go,这是 go 系统自带的包。
那能不能有自己的包呢? 可以,我们把打印 hello world 的功能移动到自己的包里,新建一个 str 文件夹,添加文件 cn.go,结构如下:
同理我们在 str 包内再新增一个 en.go 的文件,恢复一个英文问好的函数:
现在我们在 main.go 文件里来调用我们自己创建包和函数:
我们把打印的功能分散到了 str 这个包里面,但奇怪的是使用 str 的包的时候,前面多了一个项目的名称,不能直接写成 str 吗,为什么呢? 试想如果系统或者引入的第三方包也有一个叫 str 的名称,那不是就产生了冲突? 所以最好大家把自己的东西都封装在一个模块里,比如我们要的东西都是在 02-dissect-helloworld 这个模块下,那管理起来就比较方便了,那这个模块名在哪里申明的呢? 细心的你可能已经发现了,项目下有个 go.mod 文件,它的内容如下:
原来如此,我们运行一下程序,打印出两行结果,因为 fmt.Println 函数会自动在结尾加一个 \n 换行符。
这个 go.mod 文件怎么产生的呢? 运行如下命令即可:
go mod init 02-dissect-helloworld
小结一下:
1. 函数 main 是程序的入口,main 函数自己不调用,是系统加载编译后的文件来调用的
2. 包 package 用来组织代码和数据,可以是系统的、自己建的、第三方的
3. 函数 func main 所在的包名必须是 main,包名称通常是目录名,也可以叫其他名称,但同一个文件夹不同文件的包名必须一样
4. 可以用 import 导入别人的包,来扩充自己程序的功能,这样很多东西就不用自己写了,拿来主义
5. 打开 GO111MODULE=on 的情况下,go.mod 是申明项目模块化的文件,用来管理程序里所有的包(包括第三方的包)
6. 函数是用来实现单个功能的,包里面的函数要给别人用,必须使用大写字母开始
7. 系统提供的包在安装 go 的目录下的 src 文件下面,以源代码的方式存在
8. package、import、func、main 有特殊的含义,是 go 语言的保留字
本章节的代码