- Golang 官方文档: golang.google.cn
- C 语言中文网: Golang 简介
Go 语言的词法元素包括 5 种,分别是标识符(identifier)、关键字(keyword)、操作符(operator)、分隔符(delimiter)、字面量(literal),它们是组成 Go 语言代码和程序的最基本单位。
Golang 关键字
关键字即是被Go语言赋予了特殊含义的单词,也可以称为保留字。go 语言中的关键字一共有 25 个:
break | default | func | interface | select |
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
之所以刻意地将Go语言中的关键字保持的这么少,是为了简化在编译过程中的代码解析。和其它语言一样,关键字不能够作标识符使用。
Golang 标识符
标识符是指 go 语言对各种变量,方法,函数等命名时使用的字符序列,标识符由若干个字母,下划线_
和数字组成,且第一个字符必须是字母。通俗的讲就是凡是可以自己定义的名称都可以叫做标识符。
下划线 _
是一个特殊的标识符,称为空白标识符,它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因为这些值不能再后续的代码中使用,也不可以使用 _
作为变量对其他变量进行赋值或运算。
在使用标识符之前必须进行声明,声明一个标识符就是将这个标识符与常量,类型,变量,函数或者代码包绑定在一起。在同一个代码块内标识符的名称不能重复。
标识符的命名需要遵循以下规则:
- 由 26 个英文字母、0~9、
_
组成; - 不能以数字开头,例如 var 1num int 是错误的;
- Go语言中严格区分大小写;
- 标识符不能包含空格;
- 不能以系统保留关键字作为标识符,比如 break,if 等等。
命名标识符时还需要注意一下几点
- 标识符的命名要尽量采取简短且有意义;
- 不能和标准库中的包名重复;
- 为变量、函数、常量命名时采用驼峰命名法,例如 stuName、getVal;
当然 go 语言中的变量、函数、常量名称的首字母也可以是大写,如果首字母大写,则表示它可以被其他的包访问(类似 Java 中的 public);如果首字母小写,则表示它只能在本包中使用(类似 Java 中的 private)。
在 go 语言中还存在着一些特殊标识符,叫做预定义标识符,如下表所示:
append | bool | byte | cap | close | complex | complex64 | complex128 | unit16 |
copy | false | float32 | float64 | image | int | int8 | int16 | uinu32 |
int32 | int64 | iota | len | make | new | nil | panic | uint64 |
println | real | recover | string | true | uint | uint8 | uintptr |
预定义标识符一共有 36 个,主要包含Go语言中的基础数据类型和内置函数,这些预定义标识符也不可以当做标识符来使用。
Golang 运算符
运算符是用来在程序运行时执行数学或逻辑运算的,在Go语言中,一个表达式可以包含多个运算符,当表达式中存在多个运算符时,就会遇到优先级的问题,此时应该先处理哪个运算符呢?这个就由Go语言运算符的优先级来决定的。
比如下面的表达式
1
2var a, b, c int = 16, 4, 2
d := a + b*c对于表达式
a + b * c
,如果按照数学规则推导,应该先计算乘法,再计算加法;b * c
的结果为 8,a + 8
的结果为 24,所以 d 最终的值也是 24。实际上Go语言也是这样处理的,先计算乘法再计算加法,和数据中的规则一样,读者可以亲自验证一下。
先计算乘法后计算加法,说明乘法运算符的优先级比加法运算符的优先级高。所谓优先级,就是当多个运算符出现在同一个表达式中时,先执行哪个运算符。
Go语言有几十种运算符,被分成十几个级别,有的运算符优先级不同,有的运算符优先级相同,请看下表。
优先级 | 分类 | 运算符 | 结合性 |
---|---|---|---|
1 | 逗号运算符 | , |
从做到右 |
2 | 赋值运算符 | = 、+= 、-= 、*= 、/= 、%= 、>= 、<<= 、&= 、^= 、` |
=` |
3 | 逻辑或 | ` | |
4 | 逻辑与 | && |
从左到右 |
5 | 按位或 | ` | ` |
6 | 按位异或 | ^ |
从左到右 |
7 | 按位与 | & |
从左到右 |
8 | 相等/不等 | == 、!= |
从左到右 |
9 | 关秀运算符 | < 、 <= 、 > 、 >= |
从左到右 |
10 | 位移运算符 | << 、>> |
从左到右 |
11 | 加法/减法 | + 、 - |
从左到右 |
12 | 乘法/除法/取余 | * (乘号)、/ 、% |
从左到右 |
13 | 单目运算符 | ! 、* (指针)、& 、++ 、-- 、+ (正号)、- (负号) |
从右到左 |
14 | 后缀运算符 | () 、[] 、-> |
从左到右 |
注意:优先级值越大,表示优先级越高。
一下子记住所有运算符的优先级并不容易,还好Go语言中大部分运算符的优先级和数学中是一样的,大家在以后的编程过程中也会逐渐熟悉起来。
如果实在搞不清,可以加括号,就像下面这样:
1
d := a + (b * c)
括号的优先级是最高的,括号中的表达式会优先执行,这样各个运算符的执行顺序就一目了然了。
运算符的结合性是指相同优先级的运算符在同一个表达式中,且没有括号的时候,操作数计算的顺序,通常有从左到右和从右到左两种方式,例如,+ 加法运算符的结合性是从左到右,那么表达式 a + b + c 则可以理解为为 (a + b) + c。
Golang 注释
注释在程序中的作用是对程序进行注解和说明,便于对源码的阅读。编译系统在对源代码进行编译时会自动忽略注释的部分,因此注释对于程序的功能实现不起任何作用。在源码中适当地添加注释,能够提高源码的可读性。
go 语言的注释主要分成两类,分别是单行注释和多行注释
- 单行注释简称行注释,是最常见的注释形式,可以在任何地方使用以
//
开头的单行注释; - 多行注释简称块注释,以
/*
开头,并以*/
结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。
单行注释的格式如下
1 | // 单行注释 |
多行注释的格式如下
1 | /* |
每一个包都应该有相关注释,在使用 package
语句生命包名之前添加相应的注释,用来对包的功能及作用进行简要说明。同时,在 package
语句之前的注释内容讲呗默认为是这个包的文档说明。一个包可以分散在多个文件中,但是只需要对其中一个进行注释说明即可。
在多段注释之间可以使用空行分隔加以区分,如下所示:
1
2
3
4
5// package superman implements methods for saving the world.
//
// Experience has shown that a small number of procedures can prove
// helpful when attempting to save the world.
package superman对于代码中的变量、常量、函数等对象最好也都加上对应的注释,这样有利于后期对代码进行维护,例如下面代码中对 enterOrbit 函数的注释
1
2
3
4
5// enterOrbit causes Superman to fly into low Earth orbit, a position
// that presents several possibilities for planet salvation.
func enterOrbit() error {
...
}
godoc 工具
当开发人员需要了解包的一些情况时,可以使用 godoc 来显示包的文档说明,下面来介绍一下 godoc 工具的使用。
godoc 工具会从 Go 程序和包文件中提取顶级声明的首行注释以及每个对象的相关注释,并生成相关文档,也可以作为一个提供在线文档浏览的 web 服务器,Go语言官网(https://golang.google.cn)就是通过这种形式实现的。
但是Go语言 1.13 版本移除了 godoc 工具,可以通过go get 命令来获取 godoc 工具。
1
go get golang.org/x/tools/cmd/godoc
由于防火墙的原因,国内的用户可能无法通过 go get
命令来获取 godoc
工具,这时候就需要手动操作了。
首先从 GitHub 下载 golang.org/x/tools 包;
1
2cd go/src/golang.org/x/
git clone https://github.com/golang/tools.git进入 GOPATH 下的
src/golang.org/x/tools/cmd/godoc
目录,在该目录下执行go build
命令,生成 godoc 可执行文件;1
2cd tools/cmd/godoc
go build最后讲生成的 godoc 执行文件拷贝到 GOPATH 下的 bin 目录中。(需要把 GOPATH 下的 bin 目录添加到环境变量 Path 中)
1
2
3
4mkdir ~/go/bin
cp godoc ~/go/bin
echo 'export PATH=$PATH:/Users/wanwu/go/bin:/usr/local/bin' >> ~/.zshrc
source ~/.zshrc
完成上述操作后就可以使用 godoc 工具了,godoc 工具一般有以下几种用法
go doc package
:获取包的文档注释,例如go doc fmt
会显示使用 godoc 生成的 fmt 包的文档注释;go doc package/subpackage
:获取子包的文档注释,例如go doc container/list
;go doc package function
:获取某个函数在某个包中的文档注释,例如go doc fmt Printf
会显示有关fmt.Printf()
的使用说明。
go doc 示例
使用 go doc 命令获取包的文档注释
1
2
3
4
5
6
7
8
9
10
11// main 包:打印 "C 语言中文网"
package main
import (
"fmt"
)
// 声明 main 主函数
func main() {
fmt.Println("C 语言中文网")
}获取文档注释
1
2
3
4go doc main
# 输出如下信息
main 包: 打印 "C 语言中文网"