第四章(上):基本结构
文件名、关键字与标识符
文件名均由小写字母组成,如 scanner.go
。如果文件名由多个部分组成,则使用下划线 _
对它们进行分隔,scanner_test.go
。
有效的标识符必须以字母(可以使用任何 UTF-8 编码的字符或 _
)开头。
_
本身就是一个特殊的标识符,被称为空白标识符。
程序一般由关键字、常量、变量、运算符、类型和函数组成。
程序的基本结构和要素
包、导入与可见性
包是结构化代码的一种方式:每个程序都由包(通常简称为 pkg)的概念组成,可以使用自身的包或者从其它包中导入内容。
每个 Go 文件都属于且仅属于一个包。一个包可以由许多以 .go
为扩展名的源文件组成,因此文件名和包名一般来说都是不相同的。
package main
表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main
的包。
所有的包名都应该使用小写字母。
属于同一个包的源文件必须全部被一起编译,一个包即是编译时的一个单元,因此根据惯例,每个目录都只包含一个包。
每一段代码只会被编译一次
导入包的方式
1 | import "fmt" |
可见性规则
当标识符以一个大写字母开头,就可以被外部包的代码所使用,这被称为导出;标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用。
可以像面向对象语言那样使用点标记来调用:pack1.Thing
函数
1 | func functionname() |
main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
函数简短
1 | func Sum(a,b int) int {return a+b} |
只有当某个函数需要被外部包调用的时候才使用大写字母开头。
注释
注释不会被编译,但可以通过 godoc 来使用。
以 //
开头的单行注释。多行注释也叫块注释,均已以 /*
开头,并以 */
结尾
每一个包应该有相关注释,在 package 语句之前的块注释将被默认认为是这个包的文档说明。
几乎所有全局作用域的类型、常量、变量、函数和被导出的对象都应该有一个合理的注释。如果这种注释(称为文档注释)出现在函数前面,例如函数 Abcd,则要以 "Abcd..."
作为开头。
1 | // enterOrbit causes Superman to fly into low Earth orbit, a position |
类型
类型可以是基本类型,如:int、float、bool、string;结构化的(复合的),如:struct、array、slice、map、channel;只描述类型的行为的,如:interface。
结构化的类型没有真正的值,它使用 nil 作为默认值。Go 语言中不存在类型继承。
函数也可以是一个确定的类型,就是以函数作为返回类型。
一个函数可以拥有多返回值,返回类型之间需要使用逗号分割,并使用小括号 ()
将它们括起来,如:
1 | func Functionname (a int,b int) (c int,d int) |
type 关键字可以定义你自己的类型,你可能想要定义一个结构体,但是也可以定义一个已经存在的类型的别名,如:
1 | type IZ int |
并不是真正意义上的别名,使用这种方法定义之后的类型可以拥有更多的特性,且在类型转换时必须显式转换。
多个类型定义:
1 | type ( |
程序的一般结构
在完成包的 import 之后,开始对常量、变量和类型的定义或声明。
如果存在 init 函数的话,则对该函数进行定义。
如果当前包是 main 包,则定义 main 函数。
然后定义其余的函数,首先是类型的方法,接着是按照 main 函数中先后调用的顺序来定义相关函数。
1 | package main |
类型转换
Go 语言不存在隐式类型转换,因此所有的转换都必须显式说明。
类型 B 的值 = 类型 B(类型 A 的值)
1 | a := 5.0 |