Go 基础语法
环境装好后,我们来系统过一遍 Go 的基础语法。这一章不涉及复杂概念,只讲程序"长什么样"——结构、注释、分号规则、关键字。读完你就能看懂任何 Go 代码的大致框架。
1. Go 程序的基本结构
一个可执行的 Go 程序最少包含三部分:package 声明、import 导入、func main() 入口函数。看这个例子:
package main // 声明包名,每个 .go 文件必须在第一行声明所属包
import "fmt" // 导入标准库 fmt(格式化输入输出)
// 主函数:程序入口,无参数无返回值
func main() {
fmt.Println("Hello, Go!")
}
// 程序从这里开始执行,执行完 main 就结束几个要点:
package main:表示这是一个可执行程序而非库。main是特殊包名,编译器看到它就知道要生成可执行文件。import "fmt":导入标准库fmt(format 缩写)。Go 强制未使用的 import 必须删除,否则编译报错——这能保持代码整洁。func main():程序入口,无参无返回值。{表示函数体开始。
2. import 多个包
实际项目里一个文件往往要导入多个包,推荐用括号写法:
// 多个 import 用括号包起来,更整洁
import (
"fmt"
"os"
"strings"
)
// 也可以每行一个
import "fmt"
import "os"3. 注释
Go 的注释规则和 C/Java/JS 完全一致:
// 这是单行注释,双斜杠开头,到行尾结束
/* 这是多行注释,
可以跨多行,
用斜杠星号包裹 */
/*
块注释常用于:
- 文件开头的版权/说明
- 临时禁用一大段代码
*/
// 文件开头的包注释,用块注释书写
// Package math 提供基础数学函数。
package math注意 go doc 工具会读取以标识符名字开头的注释自动生成文档(如 // Println formats using the default formats...),所以写公共 API 时注释要紧贴代码、以标识符名开头。
4. 分号插入规则(重要!)
Go 和 C/Java 一样语句以分号结尾,但你几乎看不到分号——因为编译器会自动在行尾补分号。规则是:当一行的最后一个标记是
- 标识符(变量名、函数名)
- 字面量(数字、字符串)
- 关键字
break/continue/fallthrough/return - 运算符
++/--/)/]/}
时,编译器会在行尾自动插入分号。这带来一个直接后果:左花括号 { 必须跟在函数/控制语句签名的同一行,不能换行,否则编译器会在上一行末尾插入分号导致报错。
// ❌ 错误写法:左花括号换行了,编译报错
func main()
{
fmt.Println("hi")
}
// ✅ 正确写法:左花括号必须跟在函数签名行尾
func main() {
fmt.Println("hi")
}
// ❌ 错误:return 必须和值在同一行
return
42
// ✅ 正确:return 跟在值前面
return 42这条规则强制了统一的代码风格——这也是为什么 Go 社区的代码"长得都一样",几乎不存在大括号位置之争。
5. 标记(Tokens)
标记是编译器识别的最小语法单元,分六大类:
- 关键字:下面列出的 25 个保留词。
- 标识符:程序员自己起的名字(变量、函数、类型名),由字母/数字/下划线组成,不能以数字开头。
- 常量:如
true、false、iota、nil。 - 字符串字面量:双引号
"hello"或反引号`hi`包裹的内容。 - 数字字面量:整数
42、浮点3.14、复数1+2i。 - 运算符与分隔符:
+-*=(){};,等。
// 标记(tokens)是 Go 编译器识别的最小语法单元
// 下面这行语句包含 6 个标记:
age := 20
// 标记分别是:
// age (标识符)
// := (运算符:短变量声明)
// 20 (整数字面量)
// 换行 (语句分隔)
// Go 一共 25 个关键字,后面会列出
// 此外还有 ~36 个预声明标识符(int/string/len/cap/true/false 等)
// 它们不是关键字,可以重定义(但不推荐)6. Go 的 25 个关键字
Go 只有 25 个关键字,比 Java(50 个)和 C++(90+)少得多,这是它"语法简洁"的核心原因。按用途分组记忆更容易:
- 声明:
packageimportfunctypestructinterfacemapconstvar - 并发:
gochanselect - 控制流:
ifelseswitchcasedefaultfallthroughforrangebreakcontinuereturngoto - 错误处理:
defer
完整列表(字母序):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。
7. 空白符与 gofmt
Go 对待空白符(空格、Tab、换行)大部分情况下是不敏感的——除了前面讲的"行尾分号插入"。为了彻底消灭"Tab vs 空格"之类的口水战,Go 官方提供了 gofmt 工具:
- 用 Tab 缩进(不是空格)。
- 对齐赋值语句、结构体字段、注释。
- 大括号位置、空行数量都有固定规则。
在终端一行命令就能格式化整个项目:gofmt -w .。VS Code 的 Go 扩展会保存时自动运行 gofmt,所以你几乎感觉不到它的存在——但所有人写出来的代码风格完全一致。
更严格的还有 goimports,它在 gofmt 基础上还会自动增删 import 语句,是 gofmt 的超集。强烈推荐启用。
小结
这一章你了解了 Go 程序的整体骨架:包声明 → 导入 → main 函数;知道了注释和分号规则;记住了 25 个关键字的分组。下一篇我们看 Go 的数据类型——这是写任何变量之前必须搞清楚的事。
← 上一篇 Go 环境安装
下一篇 Go 数据类型 →