基础语法元素
本教程共 80 篇 · 第 7 篇 · 更新于 2026-07-27 · 约 7 分钟阅读
7. 基础语法元素
本节目标:搞懂 Go 代码由哪些基本元素构成,学会标识符命名规则,记住 25 个关键字,理解分号自动插入机制。
Go 代码长什么样
先来看一段完整的 Go 代码:
// 这是一个示例程序
package main
import "fmt"
func main() {
var name string = "Go"
fmt.Println("Hello,", name)
}
这段代码包含了 Go 的几种基本元素:注释、关键字、标识符、字符串字面量、运算符。我们逐个来认识它们。
Token(词法单元)
Go 编译器处理代码的第一步,是把源代码切分成一个个最小的不可分割单元,这些单元叫 token。
token 分四类:
- 关键字:
package、import、func等 - 标识符:你起的变量名、函数名等
- 字面量:
"Go"、42、true等固定值 - 运算符和分隔符:
=、+、(、)、{、}等
比如 var name string = "Go" 这一行,编译器会拆成:var、name、string、=、"Go" 五个 token。
你不需要刻意去记 token 这个概念,理解「编译器把代码拆成最小单元来处理」就行。
标识符
标识符就是你给变量、函数、类型、常量等起的名字。Go 的命名规则:
- 只能由字母、数字、下划线组成
- 第一个字符必须是字母或下划线
- 区分大小写(
Name和name是两个不同的标识符) - 不能和关键字重名
// 合法标识符
name
userName
_myVar
Count2
HTTPServer
// 非法标识符
2count // 数字开头
my-var // 包含减号
func // 关键字
命名惯例
Go 社区有一些约定俗成的命名风格:
- 驼峰命名:
userName、HttpClient,不用下划线分隔 - 首字母大小写决定可见性:大写
Public对外可见,小写private不可见 - 缩写全大写:
HTTP、URL、ID,不写Http、Url、Id - 短名可以用:循环变量
i、j,小作用域里用短名没问题
// 推荐写法
func parseHTTPResponse(url string) {}
var userID int
type DBClient struct{}
// 不推荐
func parse_http_response(url string) {} // 下划线风格不 Go
var userId int // Id 应该全大写
25 个关键字
Go 只有 25 个关键字,非常精简。我按用途分组列出来:
| 分类 | 关键字 |
|---|---|
| 声明 | var、const、type、func、import、package |
| 组合类型 | struct、interface、map、chan |
| 控制流 | if、else、for、switch、case、default、break、continue、fallthrough |
| 跳转 | goto、return、defer |
| 并发 | go、select |
| 其他 | range |
Note和其他语言比,Go 没有
class、try、catch、while、do、extends、implements这些关键字。Go 的设计理念是「少即是多」。
这些关键字后面都会详细讲,你现在混个眼熟就行。
预声明标识符
除了 25 个关键字,Go 还有一批预声明标识符。它们不是关键字(你可以重定义它们,但不建议),包括:
- 内置类型:
int、string、bool、float64、byte、rune、error等 - 内置函数:
len、cap、make、new、append、copy、delete、panic、recover、print、println - 常量:
true、false、iota、nil - 零值:
nil
// 理论上可以重定义,但千万别这么干
func main() {
var len = 10 // 重定义了内置函数 len,之后就用不了 len() 了
fmt.Println(len)
}
注释
Go 支持两种注释写法。
单行注释
用 // 开头,到行尾结束:
// 这是单行注释
var name string = "Go" // 行尾也可以注释
多行注释
用 /* 和 */ 包围:
/*
这是多行注释
可以写多行
*/
func main() {}
多行注释也可以当单行用:
/* 这也是合法的 */
文档注释
Go 有一个特别的约定:直接放在包声明或函数声明上方的注释,会自动成为文档。
// Package greeting provides greeting utilities.
package greeting
// Hello returns a greeting message for the given name.
func Hello(name string) string {
return "Hello, " + name
}
用 go doc 命令就能看到这些注释:
go doc greeting.Hello
Tip文档注释以标识符名称开头,这是 Go 的惯例。注释和代码之间不需要空行,紧挨着写。
分号自动插入
这是一个 Go 初学者容易踩坑的地方。
Go 的语法要求每条语句末尾有分号,但你不需要手动写。Go 编译器会在编译前自动插入分号。
规则是:如果一行的最后一个 token 是标识符、字面量、break/continue/fallthrough/return、++/--、)/}/],编译器就在行尾自动插入分号。
这就导致了一个后果:花括号不能换行写。
// 正确
func main() {
fmt.Println("Hello")
}
// 编译报错
func main()
{
fmt.Println("Hello")
}
第二种写法为什么报错?因为 func main() 后面,编译器在行尾自动插入了分号,变成了 func main();,然后 { 就变成了一个孤立的代码块开头。
同样的道理,if 和 for 的 { 也必须在同一行:
// 正确
if x > 0 {
fmt.Println("positive")
}
// 报错
if x > 0
{
fmt.Println("positive")
}
Warning这个规则是强制的。
gofmt工具会帮你处理格式,但如果你手动写代码,记得花括号跟在行尾。
字面量
字面量就是源代码里直接写出来的固定值。Go 支持几种字面量:
整数
42 // 十进制
0b1010 // 二进制(Go 1.13+)
0o755 // 八进制(Go 1.13+)
0xFF // 十六进制
1_000_000 // 下划线分隔,便于阅读(Go 1.13+)
浮点数
3.14
2.5e10 // 科学计数法
.5 // 0.5 的简写
1_000.5 // 下划线分隔
字符串
"Hello" // 普通字符串
`Hello\nWorld` // 原始字符串,反斜杠不转义
布尔值和 nil
true
false
nil
Tip下划线分隔数字是 Go 1.13 引入的,比如
1_000_000比1000000好读多了。数字之间可以任意加下划线,但不能连续加两个,也不能加在开头和结尾。
空白标识符
Go 有一个特殊的标识符:_(下划线),叫空白标识符(Blank identifier)。
它的作用是「丢弃」不需要的值:
// 只需要余数,不需要商
_, remainder := 10 / 3
// 导入包但不用(匿名导入)
import _ "github.com/lib/pq"
// 只想判断是否存在,不想要值
_, ok := m["key"]
空白标识符可以反复使用,不会报「重复声明」错误。
学完这节你能做什么
- 知道 Go 代码由哪些基本元素组成
- 给变量和函数起合法且规范的名字
- 认识 25 个关键字和常见预声明标识符
- 写规范的单行和多行注释
- 理解分号自动插入规则,不再踩花括号换行的坑
下一节讲变量声明和零值机制。