欢迎进入新的章节!
为了能够深入 go 语言的各个细节,我们需要掌握一些基本概念和 go 的相关术语。
本文程序路径是 gopl/programstructure/decltest
和 gopl/programstructure/declarations
。
运行方法:
$ cd gopl/programstructure/decltest
$ go run main.go
1. go 语言程序结构
先来看一个简单的示例:
package calc // 包声明,指示当前 go 文件属于哪个包;一个 go 文件必须要声明它属于哪个包
import "fmt" // 导入依赖包。
var five int = 5 // 包级名字:声明一个变量
// 包级名字:声明函数
func AddFive(a int) int {
var b int // 函数内部声明,只能在函数内部使用
b = a + five
fmt.Printf("%d + 5 = %d\n", a, b)
return b
}
上面的例子虽然短小,但是却是一个完整的 go 程序。总的来说,go 文件分成了三大部分:
- 包声明语句:必须的
- import 导入依赖需要包:只要使用到了某个包,就需要使用 import 语句导入。如果没有用到任何包,意味着 import 语句一行也没有。(在 go 里,如果一个 import 的包没有被使用,编译会报错。go 就是这么任性。)
- 包级名字声明,定义在函数外面。
以上面的程序为例,它的包声明是 package calc
;导入依赖只有一行 import "fmt"
;有两种包声明类型,分别是 var five int = 5
和一个 func 声明。
关于类型声明和常量声明在上面的程序里没有出现,但是在第一章你肯定见过常量声明。
2. 程序实体和名字
在 go 中,变量,常量,类型(包含结构体和接口)和函数,称为程序实体。这些程序实体的名字称为标识符。
在 go 里,标识符的名字只能以字母或下划线开头,后面跟上任意数量的字母数字或下划线。
标识符的名字不能占用 go 定义的关键字。go 的关键字目前有 25 个。
break | case | chan | const | continue
default | defer | else | fallthrough | for
func | go | goto | if | import
interface | map | package | range | return
select | struct | switch | type | var
3. 包级名字
包级名字,声明在函数外的名字。包级函数也是包级名字。
包级名字如果以大写字母开头,称之为导出的名字,可以以包外部使用它。否则就只能在包内部使用。(中文名字算是大写还是小写开头?留做作业!请不要百度 or 谷歌!)
前面我们使用过了很多导出名字,比如 fmt
包的 Printf
.
4. 声明
在 go 中,有 4 种声明,分别是 var
, const
, type
, func
。在第一章中,我们已经使用过了其中的三种,只有 type
还没有使用过。
var
声明
声明变量。
由关键字var、变量名称、变量类型、特殊标记=,以及相应的值组成。如:
var five int = 5
你也可以不写 = 5
这两部分,即:
var five int
下面的声明也是可以的,称为平行赋值(或元组赋值):
var four, five int = 4, 5
也可以这样,称为多行赋值:
var (
four int = 4
five int = 5
)
- const 声明
这里先略过,后面会详细解释
- type 声明
type 用于创建一个新的类型名称,非常像 c 语言的 typedef 关键字。使用方法:
type 新的类型名字 底层类型名字
比如:
type Second int64
以后就可以这样使用: var x Second
。
type 也用于声明复合结构和接口。比如:
// 复合结构声明
type Person struct {
name string
age int
}
接口声明,比如:
// 接口声明
type Writer interface {
Write(p []byte) (n int, err error)
}
- 函数声明
函数声明由下面几个部分组成(用):
func [函数名字]([参数列表]) ([返回值列表]) {
[函数体]
}
在 go 语言里,函数可以没有名字,称为匿名函数。参数列表和返回值列表都是可选的。在 go 中,返回值是可以有多个的,前面我已经遇到过很多次了。比如我声明一个返回 2 个值的函数:
func hello() (int, int) {
return 1, 2
}
关于函数,后续还会详细介绍。
5. 总结
- go 程序结构(三部分)
- 程序实体
- 关键字(25个)
- 标识符名字
- 包级名字,导出名字
- 4 种声明
练习:
- 请对照上面的知识点,回忆本篇内容。
- 包级名字里,中文名字是否是导出的?