首页 / Go 语言入门教程 / 基础语法元素

Go 语言入门教程

基础语法元素

本教程共 80 篇 · 第 7 篇 · 更新于 2026-07-27 · 约 7 分钟阅读

GoGo 入门教程Go 语法关键字标识符注释token

7. 基础语法元素

本节目标:搞懂 Go 代码由哪些基本元素构成,学会标识符命名规则,记住 25 个关键字,理解分号自动插入机制。

Go 代码长什么样

先来看一段完整的 Go 代码:

// 这是一个示例程序
package main

import "fmt"

func main() {
    var name string = "Go"
    fmt.Println("Hello,", name)
}

这段代码包含了 Go 的几种基本元素:注释、关键字、标识符、字符串字面量、运算符。我们逐个来认识它们。

Token(词法单元)

Go 编译器处理代码的第一步,是把源代码切分成一个个最小的不可分割单元,这些单元叫 token

token 分四类:

  • 关键字packageimportfunc
  • 标识符:你起的变量名、函数名等
  • 字面量"Go"42true 等固定值
  • 运算符和分隔符=+(){}

比如 var name string = "Go" 这一行,编译器会拆成:varnamestring="Go" 五个 token。

你不需要刻意去记 token 这个概念,理解「编译器把代码拆成最小单元来处理」就行。

标识符

标识符就是你给变量、函数、类型、常量等起的名字。Go 的命名规则:

  1. 只能由字母数字下划线组成
  2. 第一个字符必须是字母下划线
  3. 区分大小写Namename 是两个不同的标识符)
  4. 不能和关键字重名
// 合法标识符
name
userName
_myVar
Count2
HTTPServer

// 非法标识符
2count    // 数字开头
my-var    // 包含减号
func      // 关键字

命名惯例

Go 社区有一些约定俗成的命名风格:

  • 驼峰命名userNameHttpClient,不用下划线分隔
  • 首字母大小写决定可见性:大写 Public 对外可见,小写 private 不可见
  • 缩写全大写HTTPURLID,不写 HttpUrlId
  • 短名可以用:循环变量 ij,小作用域里用短名没问题
// 推荐写法
func parseHTTPResponse(url string) {}
var userID int
type DBClient struct{}

// 不推荐
func parse_http_response(url string) {}  // 下划线风格不 Go
var userId int                            // Id 应该全大写

25 个关键字

Go 只有 25 个关键字,非常精简。我按用途分组列出来:

分类关键字
声明varconsttypefuncimportpackage
组合类型structinterfacemapchan
控制流ifelseforswitchcasedefaultbreakcontinuefallthrough
跳转gotoreturndefer
并发goselect
其他range
Note

和其他语言比,Go 没有 classtrycatchwhiledoextendsimplements 这些关键字。Go 的设计理念是「少即是多」。

这些关键字后面都会详细讲,你现在混个眼熟就行。

预声明标识符

除了 25 个关键字,Go 还有一批预声明标识符。它们不是关键字(你可以重定义它们,但不建议),包括:

  • 内置类型intstringboolfloat64byteruneerror
  • 内置函数lencapmakenewappendcopydeletepanicrecoverprintprintln
  • 常量truefalseiotanil
  • 零值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();,然后 { 就变成了一个孤立的代码块开头。

同样的道理,iffor{ 也必须在同一行:

// 正确
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_0001000000 好读多了。数字之间可以任意加下划线,但不能连续加两个,也不能加在开头和结尾。

空白标识符

Go 有一个特殊的标识符:_(下划线),叫空白标识符(Blank identifier)。

它的作用是「丢弃」不需要的值:

// 只需要余数,不需要商
_, remainder := 10 / 3

// 导入包但不用(匿名导入)
import _ "github.com/lib/pq"

// 只想判断是否存在,不想要值
_, ok := m["key"]

空白标识符可以反复使用,不会报「重复声明」错误。

学完这节你能做什么

  • 知道 Go 代码由哪些基本元素组成
  • 给变量和函数起合法且规范的名字
  • 认识 25 个关键字和常见预声明标识符
  • 写规范的单行和多行注释
  • 理解分号自动插入规则,不再踩花括号换行的坑

下一节讲变量声明和零值机制。