Go语法基础 #
一、注释 #
1.1 单行注释 #
使用//开头:
go
fmt.Println("Hello") // 打印Hello
// 这是单行注释
1.2 多行注释 #
使用/* */包裹:
go
/*
这是多行注释
可以跨越多行
用于详细说明
*/
func main() {
fmt.Println("Hello")
}
1.3 文档注释 #
写在函数/类型声明上方,用于生成文档:
go
func Add(a, b int) int {
return a + b
}
查看文档:
bash
go doc Add
二、标识符 #
2.1 命名规则 #
标识符用于命名变量、函数、类型等,规则如下:
- 由字母、数字、下划线组成
- 必须以字母或下划线开头
- 区分大小写
- 不能使用关键字
go
userName // 正确
_user // 正确
User123 // 正确
2name // 错误:以数字开头
my-var // 错误:包含连字符
2.2 可见性规则 #
Go通过首字母大小写控制可见性:
- 大写开头:公开(可导出),其他包可访问
- 小写开头:私有,仅本包可访问
go
type Person struct {
Name string // 公开
age int // 私有
}
func (p *Person) GetName() string { // 公开方法
return p.Name
}
func (p *Person) getAge() int { // 私有方法
return p.age
}
2.3 命名约定 #
| 类型 | 约定 | 示例 |
|---|---|---|
| 包名 | 小写,简短 | fmt, http |
| 变量/函数 | 驼峰命名 | userName, getInfo |
| 常量 | 驼峰命名 | maxSize, DefaultValue |
| 接口 | 单方法以er结尾 | Reader, Writer |
| 类型 | 驼峰命名 | UserInfo, HttpRequest |
2.4 空标识符 #
_是特殊标识符,用于忽略值:
go
_, b := 1, 2 // 忽略第一个返回值
for _, value := range []int{1, 2, 3} {
fmt.Println(value)
}
三、关键字 #
Go只有25个关键字:
3.1 关键字列表 #
go
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
3.2 分类说明 #
| 分类 | 关键字 |
|---|---|
| 声明 | var, const, type, func, package, import |
| 程序结构 | break, case, continue, default, else, fallthrough, for, goto, if, range, return, select, switch |
| 并发 | go, chan, select |
| 类型 | struct, interface, map |
| 其他 | defer, const |
3.3 预声明标识符 #
Go还预声明了一些标识符:
内置类型:
go
bool byte complex64 complex128 error float32 float64
int int8 int16 int32 int64 rune string
uint uint8 uint16 uint32 uint64 uintptr
常量:
go
true false iota nil
内置函数:
go
append cap close complex copy delete imag len
make new panic print println real recover
四、运算符与分隔符 #
4.1 运算符 #
go
+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
&^ &^= ...
4.2 分隔符 #
go
() 小括号:函数调用、表达式分组
[] 中括号:数组/切片索引、类型参数
{} 大括号:代码块、复合字面量
, 逗号:参数分隔
; 分号:语句结束(通常省略)
: 冒号:标签、切片声明
. 点:成员访问、包限定
五、字面量 #
5.1 整数字面量 #
go
10 // 十进制
0755 // 八进制(0开头)
0x1F // 十六进制(0x开头)
0b1010 // 二进制(0b开头,Go 1.13+)
1_000_000 // 数字分隔符(Go 1.13+)
5.2 浮点数字面量 #
go
3.14
3. // 等于 3.0
.14 // 等于 0.14
3.14e10 // 科学计数法
3.14E-10
0x1.fp-2 // 十六进制浮点数
5.3 字符字面量 #
go
'a' // 字符
'中' // Unicode字符
'\n' // 转义字符
'\x41' // 十六进制
'\u4e2d' // Unicode码点
'\U00004e2d' // Unicode码点(完整形式)
转义字符:
| 转义 | 含义 |
|---|---|
\n |
换行 |
\t |
制表符 |
\r |
回车 |
\\ |
反斜杠 |
\' |
单引号 |
\" |
双引号 |
5.4 字符串字面量 #
原始字符串(反引号):
go
`Hello, World!`
`多行
字符串`
解释字符串(双引号):
go
"Hello, World!\n"
"你好,世界"
5.5 布尔字面量 #
go
true
false
5.6 复合字面量 #
go
[]int{1, 2, 3} // 切片
map[string]int{"a": 1, "b": 2} // 映射
Person{Name: "Tom", Age: 20} // 结构体
六、代码规范 #
6.1 大括号风格 #
左大括号必须在同一行:
go
func main() {
fmt.Println("Hello")
}
func main()
{ // 错误!
fmt.Println("Hello")
}
6.2 缩进 #
使用Tab缩进(gofmt会自动处理):
go
func main() {
if true {
fmt.Println("Hello")
}
}
6.3 行长度 #
建议不超过80字符,超过可换行:
go
result := someFunction(
arg1,
arg2,
arg3,
)
6.4 空格 #
运算符两侧加空格:
go
x := 1 + 2
if x > 0 {
fmt.Println(x)
}
逗号后加空格:
go
func add(a, b int) int {
return a + b
}
6.5 导入排序 #
按标准库、第三方库、本地包分组:
go
import (
"fmt"
"os"
"github.com/gin-gonic/gin"
"myapp/utils"
)
七、工具支持 #
7.1 gofmt #
自动格式化代码:
bash
gofmt -w main.go
gofmt -w .
7.2 goimports #
自动管理导入:
bash
go install golang.org/x/tools/cmd/goimports@latest
goimports -w main.go
7.3 go vet #
静态分析检查:
bash
go vet ./...
7.4 golint #
代码风格检查:
bash
go install golang.org/x/lint/golint@latest
golint ./...
八、最佳实践 #
8.1 命名建议 #
- 使用有意义的名称
- 短名称用于局部变量
- 长名称用于导出标识符
- 避免使用无意义的缩写
go
// 好
func calculateTotalPrice(items []Item) float64
// 不好
func calcTP(i []Item) float64
8.2 注释建议 #
- 解释"为什么"而非"是什么"
- 保持注释与代码同步
- 公开标识符必须有文档注释
go
func Max(a, b int) int {
if a > b {
return a
}
return b
}
8.3 代码组织 #
- 相关代码放在一起
- 函数按调用顺序排列
- 常量、变量、类型、函数依次排列
go
package main
const maxRetry = 3
var defaultTimeout = 30 * time.Second
type Config struct {
Timeout time.Duration
}
func main() {
// ...
}
func helper() {
// ...
}
九、总结 #
Go语法基础要点:
- 注释:单行
//、多行/* */ - 标识符:驼峰命名、首字母控制可见性
- 关键字:25个关键字,简洁明了
- 字面量:数字、字符、字符串、布尔值
- 代码规范:使用gofmt自动格式化
Go的设计哲学:
- 简洁:少量关键字,清晰语法
- 规范:工具强制代码风格
- 实用:减少不必要的复杂性
准备好学习数据类型了吗?让我们进入下一章!
最后更新:2026-03-26