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 - true 或 false
字符串 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

byte 和 rune

这两个类型在 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 程序,并理解 package、import、func、var、:=、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
本站总字数:196.7k 字
载入天数...载入时分秒... ·