Go 语言语法完全指南

📅 2026/6/29 20:19:54
Go 语言语法完全指南
前言Go也称 GolangGoogle 推出的一门静态强类型、编译型语言。特点语法简介、编译快、并发能力强、工程化支持完善。应用领域如后端开发、云原生、微服务、分布式系统、DevOps 工具链等。本文是我学习 Golang 后以系统性总结的方式对其语法知识进行完整梳理作为后续 go 开发时参考笔记也可作为Go 初学者系统入门笔记Go 语法速查手册编写 Go 项目时基础知识参考目录1. Go 语言简介2. Go 程序基本结构3. 基础语法4. 流程控制5. 复合数据类型6. 指针7. 函数8. 结构体9. 方法10. 接口11. 错误处理12. 并发编程13. 泛型Go 1.1814. 文件与 I/O 操作15. 反射Reflection16. 常用标准库概览17. 测试18. 包、模块与工程化管理19. Go 常见易错点总结20. 编码规范与最佳实践1. Go 语言简介1.1 语言特点语法简介: Go 语法简洁。借鉴了 C 语言的风格但去掉了许多复杂的特性。编译型语言编译速度极快生成单一二进制文件。天生并发内置 goroutine 和 channel 简化并发编程。垃圾回收无需手动管理内存。静态类型 类型推断既有静态类型的安全性又有类型推断的便利性。标准库丰富网络、文件、编码、加密、测试等开箱即用工程化能力强内置格式化、测试、模块管理工具。跨平台支持多种操作系统和架构这没啥好说的市面上大部分语言都支持。1.2 应用场景Web 后端开发API 服务开发云原生与容器生态微服务架构网络编程运维工具和命令行工具分布式系统1.3 环境搭建# 下载安装https://go.dev/dl/# 验证安装go version# 如果安装成功会输出类似信息go version go1.22.0 windows/amd641.4 Hello World创建文件main.go内容如下package mainimport fmtfunc main() {fmt.Println(Hello, World!)}go run main.go # 直接运行go build main.go # 编译生成二进制2. Go 程序基本结构Go 程序通常由以下几个部分组成包声明导入包全局声明函数定义main 函数2.1 package每个 Go 文件都必须以package开头用于声明该文件属于哪个包。package main如果一个程序要作为可执行程序运行则必须使用main包。2.2 import使用import导入依赖包。import fmt如果导入多个包可以使用圆括号import (fmttime)2.3 main 函数Go 程序的入口是main包中的main()函数。func main() {fmt.Println(程序开始执行)}2.4 注释Go 支持两种注释方式单行注释// 这是单行注释多行注释/*这是多行注释可以写多行内容*/2.5 标识符命名规则标识符包括变量名、函数名、类型名等命名规则如下由字母、数字、下划线组成不能以数字开头区分大小写不能与关键字重名例如var name stringvar userAge intvar _temp int2.6 可见性规则Go 使用首字母大小写控制访问权限首字母大写可被包外访问首字母小写仅包内可访问例如type User struct {Name stringage int}其中Name可导出age不可导出3. 基础语法3.1 变量// 显式声明var name string Govar age int // 零值0// 类型推断var score 100// 短变量声明只能在函数内部使用lang : Golang// 批量声明var a, b, c intvar x, y 10, 20// 也可以分组声明var (name string Aliceage int 20city string Beijinggender bool // 零值false)// Go 使用 _ 表示匿名变量用于忽略某个值常见于函数多返回值场景。n, _ : 10, 20fmt.Println(n)零值规则Go 中变量声明后自动初始化为零值。类型零值int/float0stringboolfalse指针/切片/map/channel/接口/函数nil3.2 常量const Pi 3.14159const (StatusOK 200StatusNotFound 404)// iota常量生成器从 0 开始自增const (Sunday iota // 0Monday // 1Tuesday // 2)// iota 高级用法const (_ iota // 0 丢弃KB 1 (10 * iota) // 1 10 1024MB // 1 20GB // 1 30)3.3 基本数据类型示例// 整型对应的无符号整型- uint uint8 uint16 uint32 uint64var a int // 平台相关32 或 64 位var b int8 // -128 ~ 127var c int16var d int32 // 别名 rune表示 Unicode 码点var e int64var f uint8 // 别名 byte0 ~ 255// 浮点var g float32var h float64 // 默认浮点字面量类型// 复数var i complex64var j complex128// 布尔var k bool // 布尔类型只有两个值true 和 false注意Go 中不能将整数直接当作布尔值使用。// 字符串Go 中字符串本质上是**只读字节序列**var s string hello// rune 与 byte字节与字符var r rune 中 // int32 别名Unicode 码点var by byte A // uint8 别名常见转义字符\n换行\t制表符\双引号\\反斜杠\r回车\b退格\0空字符原始字符串使用反引号 定义原始字符串保留原始格式str : 这是一个原始字符串不会处理转义字符 \n可以换行3.4 类型转换Go没有隐式类型转换必须显式转换var i int 42var f float64 float64(i)var u uint uint(f)var x float64 3.14var y int int(x) // 注意浮点转整数会截断小数部分y 的值为 3// 字符串 - 数字 需要用 strconvs : strconv.Itoa(42) // int - string: 42n, _ : strconv.Atoi(42) // string - int: 42// 字符串 - 字节切片bs : []byte(hello)s2 : string(bs)3.5 自定义类型与类型别名// 自定义类型全新类型可以添加方法type Celsius float64type Handler func(string) errortype MyInt intvar a MyInt 10// MyInt 是 int 的新类型不能直接赋值var b int a // ❌ 编译错误var c int int(a) // ✅ 需要显式转换// 类型别名完全等同于原类型type Byte uint8type Rune int32var x Byte 255var y uint8 x // ✅ Byte 是 uint8 的别名可以直接赋值var z Rune Az 300 // ✅ Rune 是 int32 的别名可以直接赋值