本节将通过Hello World带领大家进入Go的世界,并由此介绍Go代码的主要结构、部分关键字和包的一些特性。为阅读后面的打下基础。
1. Let's go
咱们以往学习任何程序都会以Hello World作为第一个实例,在此咱们不按常理出牌,针对Go语言,我们的第一个程序以Let's go开始。(其实是换汤不换药哈!!)。
代码如下:
控制台的输出结果为:Let's go!
- 第2行:定义此代码所属的包名,在一个项目中有且只有一个名为main的包。(最佳实践:包名由简短且小写的字母构成)
- 包名为源代码文件所属的目录名。即同一包的所有的代码文件必须放在以此包名为目录名的目录下。
- 在包的定义声明中只能有一个包名,这与Java、C#是不一样的(注:在Java中的包定义是从根依次引入的)
- 第5~7行:定义此代码所依赖的其它包。(关键字import等同于Java中的import)
- 可以引入多个包,并支持放在同一行,彼此之间以逗号“,”分隔。
- 最佳实践:包的引入按标准库包,自定义包,第三方包的顺序定义
- 第10行:为程序的入口函数,类似于C,Java中的main方法。
- 第12行:调用标准库fmt中的Println函数将字符串输出到标准输出设备上。
- 此库中还有几个类型的函数,如:Printf(), Fprint()等。
- 在Go的注释方式支持两种,与C,Java相同。
- 单行的注释://
- 多行的注释:/* */
- 在包定义、包引入、全局变量/常量、函数定义上面的注释可以用godoc来查看或生成说明文档(注:注释与声明间不能有空行)
- Go为了减少编码的输入,让代码更简洁。它允许每一行的最后可以省略分号“;"。
- 最后编译链接后生成一个可执行二事制文件,如在Windows平台上为.exe文件。(注:此文件中包含了Go的运行时环境 -- 这使发布此程序变量的简单,不需要客户机上单独安装运行环境)
2. 包的特点
包即是Go中组织源代码的一种结构,每一个go源码文件只能属于一个包(即存放于此包对应的目录下),但一个包可以包括多个go源码文件(但这些文件不能有同名)。(注:包的字名需要有小写字符)
在编译时,包中的所有文件需要一起编译,并最终生成一个扩展为.a的文件,如pack1.a。
Go标准库所处的目录因环境不同而有所差异:
- 通用的标准是:$GOROOT\pkg\$GOOS_$GOARCH
- Windows:$GOROOT\pkg\windows_386
- Linux:$GORROT\pkg\linux_amd32/64
包的依赖引用需显示的说明其依赖关系,由此加快编译速度。当一个包改变或重新编译后,所有的依赖于它的代码都将被重新编译。
假设这里有三个文件:a.go依赖于b.go,b.go依赖于c.go:
- 编译顺序为:c.go -> b.go -> a.go
- 当只编译a.go时,编译器只需读取b.o文件,而不需要c.o。
当使用import引用包时,需注意它的搜索路径:
- 当没有以/开始时(如"fmt","container/list"),Go编译器会到Go的标准库中搜索此包。
- 当以./开始时,则从当前路径为起始目录开始搜索。
- 当以/开始时,则从系统的根目录开始搜索。
3. 包引用的可见规则
在Go中对包中定义的各种标识(常量、变量、函数、类型等)的可见性只有两种:
- 以大写字母开始的标识,在包外可见。即当使用import引用包时,这些标准可以在客户代码中直接调用(引用)。也就相当于Java中以Public关键字修饰的标识。
- 以小字字母开始的标识,在整个包内可见,即可以在包内的多个文件中可见。相当于Java中用private修饰的标识。
- 包相关于命名空间,不同包下相同名字并不冲突,并在某些特定情况可以在import包时,指定别名来在避免冲突。
4. 实例代码
本例主要展示自定包义的组织结构、包中各代码文件的关系、代码中各种标识符的可见性和包的引用。代码结构如下所示:
- 新创建一个名为chapter3的包,其中包括两个代码文件(demo1.go和demo2.go)和子包inner。
- 子包inner中包含一个代码文件:innerpack.go。
各代码块如下:
- main包及入口函数
- demo1.go
- demo2.go
- inner包中的innerpack.go
- 输出结果为:
总结:
- 在客户代码中导入自定义包时,一般是通过相对路径来指定,而对于导入标准库时,则是直接以包名开始。 如本例的demo1.go的第4,5行:
- 第4行:导入的是自定包,位于子目录inner中。
- 第5行:导入标准库的包,则直接以包名开始,以映射到$GOROOT\pkg\windows_386\。
- 包的导入顺序:首先是自定义包,再是标准包。
- 同包中的多个代码文件彼此间的全局变量、函数等都是相互可见的。
- 如在demo1.go中可以直接调用demo2.go中的以小写字母开头的方法。
- 如在demo2.go中可以直接调用demo1.go中的以小写字母开头的变量。
- 以大写字母开头的常量、变量和函数等在包外是可见的。
- 每个包编译后都会生成一个以包名相同的扩展为.a的库文件。
- 在同一包中的多个文件中不能有同名的变量、常量、函数等。需保证在包内唯一。
有疑问加站长微信联系(非本文作者)