Go 教程第一课

开始学习 Go

Go 语言学习笔记

更新日期:2026-08-06


一、教程下载与运行

1. 下载官方交互式教程

Go 官方提供了交互式学习教程 Tour of Go,可以下载到本地运行。

1
go install golang.org/x/website/tour@latest

安装完成后,在终端执行:

1
tour

启动本地教程服务,然后在浏览器访问终端提示的地址。

官方在线教程:

https://go.dev/tour/welcome/1


二、包、变量和函数

1. 常见的包

Go 的标准库提供了大量开箱即用的功能。

包名 用途
fmt 格式化输入输出
math 数学计算
strings 字符串处理
time 时间和日期处理
os 操作系统相关功能
net/http HTTP 客户端和服务器
encoding/json JSON 编解码

2. 导入包

方式一:逐个导入

1
2
import "fmt"
import "math"

方式二:分组导入

推荐使用分组导入:

1
2
3
4
import (
    "fmt"
    "math"
)

3. 导出名称

Go 使用首字母大小写来控制标识符是否可以被其他包访问。

首字母大写:导出

首字母大写的名称可以被其他包访问。

1
fmt.Println(math.Pi)

例如:

1
math.Pi

其中 Pi 首字母大写,因此可以从 math 包外部访问。

首字母小写:未导出

首字母小写的名称只能在当前包内部使用。

1
math.pi

外部无法访问。

核心规则:

  • 大写开头 → 导出 → 其他包可以访问
  • 小写开头 → 未导出 → 仅当前包可以访问

4. 函数定义

Go 函数的基本格式:

1
2
3
func 函数名(参数名 参数类型) 返回类型 {
    // 函数体
}

例如:

1
2
3
func add(x int, y int) int {
    return x + y
}

参数类型简写

如果连续多个参数类型相同,可以只写最后一个参数的类型:

1
2
3
func add(x, y int) int {
    return x + y
}

这与下面的写法完全等价:

1
2
3
func add(x int, y int) int {
    return x + y
}

5. 变量

Go 使用 var 声明变量。

1
2
var age int
var name string

如果变量声明时没有进行初始化,Go 会自动赋予该变量对应类型的零值

类型 零值
整数类型 0
浮点类型 0
bool false
string ""
指针 nil
切片 nil
Map nil
Channel nil
Function nil
Interface nil

例如:

1
2
3
4
5
6
7
var age int
var name string
var active bool

fmt.Println(age)    // 0
fmt.Println(name)   // ""
fmt.Println(active) // false

6. 短变量声明

函数内部,可以使用 := 进行短变量声明。

1
2
3
4
5
6
func main() {
    name := "Go"
    age := 20

    fmt.Println(name, age)
}

:= 会同时完成:

  1. 创建变量
  2. 推断变量类型
  3. 赋值

例如:

1
a, b := swap("hello", "world")

注意

:= 不能用于函数外部的包级变量声明

错误:

1
2
3
package main

name := "Go" // ❌ 包级作用域不能使用 := 

正确:

1
2
3
package main

var name = "Go" // ✅ 包级变量使用 var 声明 

三、Go 基本类型

Go 的基本类型主要包括布尔、字符串、整数、浮点数和复数。

类别 类型 别名 / 关联 说明
布尔 bool - truefalse
字符串 string - 不可变字节序列,通常存储 UTF-8 编码文本
有符号整数 int - 平台相关,通常为 32 位或 64 位
int8 - -128 ~ 127
int16 - -32768 ~ 32767
int32 rune 常用于表示 Unicode 码点
int64 - 64 位有符号整数
无符号整数 uint - 平台相关,与 int 位宽通常相同
uint8 byte 0 ~ 255,常用于表示原始字节
uint16 - 0 ~ 65535
uint32 - 32 位无符号整数
uint64 - 64 位无符号整数
uintptr - 足以存储指针地址的无符号整数
浮点数 float32 - 单精度浮点数
float64 - 双精度浮点数,通常优先使用
复数 complex64 - 实部和虚部均为 float32
complex128 - 实部和虚部均为 float64

byterune

这两个类型在 Go 中非常常见:

1
2
type byte = uint8
type rune = int32

因此:

1
2
var b byte
var r rune

分别可以理解为:

  • byte → 一个字节,常用于处理二进制数据
  • rune → 一个 Unicode 码点,常用于处理字符

例如:

1
2
3
var r rune = '中'

fmt.Println(r)

四、类型转换

Go 不会自动进行大多数数值类型之间的隐式转换。

需要使用:

1
T(v)

其中:

  • T 是目标类型
  • v 是需要转换的值

例如:

1
2
3
4
var x int = 10
var y float64 = float64(x)

fmt.Println(y)

也可以:

1
2
3
4
var a float64 = 10.5
var b int = int(a)

fmt.Println(b) // 10

注意:浮点数转换为整数时,小数部分会被截断。


1. 查看变量类型

可以使用 fmt.Printf%T 查看变量类型:

1
fmt.Printf("v is of type %T\n", v)

例如:

1
2
3
name := "Go"

fmt.Printf("name is of type %T\n", name)

输出:

1
name is of type string

五、常量

Go 使用 const 定义常量:

1
const Pi = 3.14

常量创建后不能重新赋值:

1
2
3
const Pi = 3.14

// Pi = 3.14159 // ❌ 常量创建后不能重新赋值 

常量不能使用 :=

错误:

1
Pi := 3.14 // ❌

正确:

1
const Pi = 3.14 // ✅ 正确 

六、常见框架与库

1. Web 框架 / HTTP 路由

Go Web 开发中常见的选择:

框架 / 库 特点 推荐场景
Gin 高性能、简洁、生态成熟 REST API、微服务
Echo API 简洁、中间件丰富 REST API
Fiber 类似 Express.js、基于 fasthttp Node.js 转 Go、性能敏感场景
Chi 轻量、兼容 net/http 希望尽量使用标准库
net/http Go 官方标准库 学习 HTTP、简单 Web 服务

入门建议

对于 Go 初学者,可以按照下面的顺序:

1
2
3
4
5
net/http
Gin
Chi / Echo

先理解 Go 标准库的 HTTP 工作方式,再使用 Web 框架,可以避免只会调用框架 API 而不了解底层原理。


七、数据库相关

包 / 工具 类型 说明
GORM ORM 功能完整、上手简单
sqlx SQL 扩展 基于 database/sql,更接近原生 SQL
ent ORM / 代码生成 类型安全,适合复杂数据模型
sqlc SQL 代码生成 根据 SQL 自动生成类型安全的 Go 代码
go-redis Redis 客户端 Go 生态中常用的 Redis 客户端
rueidis Redis 客户端 高性能 Redis 客户端

学习建议

如果已经有 MySQL、MyBatis-Plus 等 Java 开发经验,可以重点理解 Go 中:

1
2
3
4
5
database/sql
sqlx
GORM / ent

同时学习:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Go
MySQL
Redis
事务
连接池
并发

八、配置、日志和工具

用途
Viper 配置管理,支持 YAML、JSON、环境变量等
Cobra CLI 命令行工具
Zap 高性能日志
Zerolog 高性能结构化日志
Logrus 常见日志库
Testify 测试断言、Mock
Validator 结构体参数校验
Google UUID UUID 生成

九、微服务与 RPC

1. gRPC + Protocol Buffers

Go 微服务中非常常见的 RPC 技术组合:

1
2
3
4
5
6
7
8
客户端
   │ gRPC
服务端
Protocol Buffers

主要特点:

  • 高性能
  • 强类型
  • 自动生成客户端和服务端代码
  • 适合微服务内部通信

2. 常见 Go 微服务框架

框架 / 工具 特点
gRPC + Protobuf 主流 RPC 技术方案
go-zero 国内使用较多的微服务框架
Kratos 微服务框架
go-kit 微服务工具集,更偏底层库

十、其他常用工具包

用途
gorilla/websocket WebSocket 通信
robfig/cron 定时任务
excelize Excel 文件读写
golang-jwt/jwt JWT 身份认证
bcrypt 密码哈希
argon2 密码哈希
samber/lo 类似 Lodash 的工具函数
resty HTTP 客户端

十一、第一课学习重点

第一课暂时不要急着记忆大量第三方框架,优先掌握 Go 语言基础。

建议按照下面的顺序学习:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
包 package
导入 import
导出名称
函数 func
变量 var
短变量声明 :=
基本类型
类型转换
常量 const
控制流程
数组 / 切片
Map
Struct
指针
方法
接口
Goroutine
Channel

第一课核心目标:

能够独立看懂一个简单 Go 程序,并理解 packageimportfuncvar:=const 以及 Go 基本类型的含义。


十二、一个完整示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "fmt"

const Pi = 3.14

func add(x, y int) int {
    return x + y
}

func main() {
    name := "Go"
    age := 20

    result := add(10, 20)

    fmt.Println("Hello,", name)
    fmt.Println("Age:", age)
    fmt.Println("Result:", result)
    fmt.Println("Pi:", Pi)

    fmt.Printf("name type: %T\n", name)
    fmt.Printf("age type: %T\n", age)
}

这个程序综合使用了:

  • package
  • import
  • const
  • func
  • :=
  • int
  • string
  • 函数调用
  • fmt.Println
  • fmt.Printf
  • %T 类型格式化

十三、第一课总结

这一课主要认识 Go 的基础语法:

知识点 关键语法
package
导入 import
导出 首字母大写
函数 func
变量 var
短变量 :=
常量 const
类型转换 T(v)
查看类型 %T
输出 fmt.Println() / fmt.Printf()

下一阶段重点:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
流程控制
for / if / switch
数组
切片 Slice
Map
Struct
指针
方法
接口
Licensed under CC BY-NC-SA 4.0
Last updated on Aug 23, 2026 17:59 CST
本站总字数:193.5k 字
载入天数...载入时分秒... ·