#《Go 语音圣经(中文版)》

#程序结构

#命名

Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。大写字母和小写字母是不同的。

Go语言的25个关键字:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

预定义的名字[1]

1
2
3
4
5
6
7
8
9
10
11
12
13
// 内建常量: 
true false iota nil

// 内建类型:
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error

// 内建函数:
make len cap new append copy close delete
complex real imag
panic recover

如果一个名字是在函数内部定义,那么它的就只在函数内部有效。

如果是在函数外部定义,那么将在当前包的所有文件中都可以访问。

名字的开头字母的大小写决定了名字在包外的可见性。如果一个名字是大写字母开头的(包级函数名本身也是包级名字,例如:fmt.Printf),那么它将是导出的,可以被外部的包访问,包本身的名字一般总是用小写字母。

如果一个名字的作用域比较大,生命周期也比较长,那么用长的名字将会更有意义。

Go语言程序员推荐使用驼峰式命名,当名字有几个单词组成的时优先使用大小写分隔,而不是优先用下划线分隔。

#声明

声明语句定义了程序的各种实体对象以及部分或全部的属性。

Go语言主要有四种类型的声明 语句:varconsttypefunc,分别对应变量常量类型函数实体对象的声明。

每个源文件以包的声明语句开始,说明该源文件是属于哪个包。包声明语句之后是import语句导入依赖的其它包,然后是包一级的类型、变量、常量、函数的声明语句,包一级的各种类型的声明语句的顺序无关紧要(函数内部的名字则必须先声明之后才能使用)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Boiling prints the boiling point of water.
package main

import "fmt"

func main() {
var f = boilingF
var c = (f - 32) * 5 / 9
fmt.Printf("boiling point = %g°F or %g°C\n", f, c)
// Output:
// boiling point = 212°F or 100°C
}

const boilingF = 212.0

在包一级声明语句声明的名字(boilingF)可在整个包对应的每个源文件中访问,而不是仅仅在其声明语句所在的源文件中访问。

一个函数的声明由一个函数名字、参数列表、一个可选的返回值列表和包含函数定义的函数体组成。如果函数没有返回值,那么返回值列表是省略的。

1
2
3
4
5
6
7
8
9
10
11
12
13
// Ftoc prints two Fahrenheit-to-Celsius conversions.
package main

import "fmt"

func main() {
const freezingF, boilingF = 32.0, 212.0
fmt.Printf("%g°F = %g°C\n", freezingF, fToC(freezingF)) // "32°F = 0°C"
fmt.Printf("%g°F = %g°C\n", boilingF, fToC(boilingF)) // "212°F = 100°C"
}
func fToC(f float64) float64 {
return (f - 32) * 5 / 9
}

#变量

var声明语句可以创建一个特定类型的变量,然后给变量附加一个名字,并且设置变量的初始值。

1
var 变量名字 类型 = 表达式

其中类型= 表达式两个部分可以省略其中的一个。如果省略的是类型信息,那么将根据初始化表达式来推导变量的类型信息。如果初始化表达式被省略,那么将用零值初始化该变量。

可以在一个声明语句中同时声明一组变量。也可以用一组初始化表达式声明并初始化一组变量,如果省略每个变量的类型,将可以声明多个类型不同的变量。

1
2
3
4
5
// int, int, int
var i, j, k int

// bool, float64, string
var b, f, s = true, 2.3, "four"

在包级别声明的变量会在main入口函数执行前完成初始化。局部变量将在声明语句被执行到的时候完成初始化。

在函数内部,有一种称为简短变量声明语句的形式可用于声明和初始化局部变量。它以名字 := 表达式形式声明变量,变量的类型根据表达式来自动推导。

简短变量声明语句也可以用来声明和初始化一组变量。

简短变量声明语句中必须至少要声明一个新的变量。[2]

简短变量声明语句只有对已经在同级词法域声明过的变量才和赋值操作语句等价,如果变量是在外部词法域声明的,那么简短变量声明语句将会在当前词法域重新声明一个新的变量。


  1. 可以在定义中重新使用它们。 ↩︎

  2. 如果都是旧的,赋值操作就好。 ↩︎