go学习计划
Table of Contents
让 DeepSeek 给我生成了一个快速的 go 学习计划,它说需要 2-3 个月,可是我没那么多时间,只有 2 到 3 天,打个对折吧,2-3 天学一半,应该问题不大
第一章:基础语法(深度扩展)
示例 1:作用域与闭包
func scopeDemo() {
x := 10
{ // 代码块作用域
x := 20 // 新建局部变量
fmt.Println(x) // 20
}
fmt.Println(x) // 10
// 闭包捕获变量
adder := func() func(int) int {
sum := 0
return func(n int) int {
sum += n
return sum
}
}
a := adder()
fmt.Println(a(1), a(2)) // 1, 3
}
示例 2:类型转换与断言
func typeConversion() {
// 基本类型转换
var i int = 42
f := float64(i)
// 接口类型断言
var val interface{} = "hello"
if s, ok := val.(string); ok {
fmt.Println(s + " world!") // hello world!
}
}
示例 3:常量与 iota
const (
_ = iota // 忽略0
KB = 1 << (10 * iota) // 1 << 10
MB // 1 << 20
)
func main() {
fmt.Println(KB, MB) // 1024 1048576
}
第二章:数据结构(实战强化)
示例 1:切片高级操作
func sliceAdvanced() {
// 预分配容量
s := make([]int, 0, 5) // len=0, cap=5
s = append(s, 1,2,3)
// 内存共享机制
arr := []int{1,2,3,4,5}
s1 := arr[1:3] // [2,3] (cap=4)
s2 := s1[:4] // 扩展至底层数组末尾 [2,3,4,5]
}
示例 2:结构体嵌套
type Address struct {
City string
Zip string
}
type User struct {
Name string
Age int
Address // 匿名嵌套
}
func main() {
u := User{
Name: "Alice",
Age: 25,
Address: Address{City: "Beijing", Zip: "100000"},
}
fmt.Println(u.City) // 直接访问嵌套字段
}
示例 3:JSON 序列化
type Book struct {
Title string `json:"title"`
Author string `json:"author,omitempty"` // omitempty表示空值忽略
}
func main() {
b := Book{Title: "Go语言实战"}
data, _ := json.Marshal(b)
fmt.Println(string(data)) // {"title":"Go语言实战"}
}
第三章:并发编程(工业级案例)
示例 1:工作池模式
func workerPool() {
jobs := make(chan int, 100)
results := make(chan int, 100)
// 启动3个worker
for w := 1; w <= 3; w++ {
go func(id int) {
for j := range jobs {
fmt.Printf("Worker %d processing job %d\n", id, j)
results <- j * 2
}
}(w)
}
// 发送任务
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs)
// 收集结果
for a := 1; a <= 5; a++ {
<-results
}
}
示例 2:通道超时控制
func fetchWithTimeout(url string) (string, error) {
ch := make(chan string, 1)
go func() {
resp, _ := http.Get(url)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
ch <- string(body)
}()
select {
case res := <-ch:
return res, nil
case <-time.After(2 * time.Second): // 2秒超时
return "", fmt.Errorf("timeout")
}
}
示例 3:sync.WaitGroup 同步
func waitGroupDemo() {
var wg sync.WaitGroup
urls := []string{"url1", "url2", "url3"}
for _, url := range urls {
wg.Add(1)
go func(u string) {
defer wg.Done()
http.Get(u) // 模拟请求
fmt.Println("Done:", u)
}(url)
}
wg.Wait() // 等待所有完成
fmt.Println("All jobs done")
}
第四章:工程实践(生产级代码)
示例 1:Gin 中间件
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("Authorization")
if token != "valid_token" {
c.AbortWithStatusJSON(401, gin.H{"error": "Unauthorized"})
return
}
c.Next()
}
}
func main() {
r := gin.Default()
r.Use(AuthMiddleware()) // 全局中间件
r.GET("/secure", func(c *gin.Context) {
c.String(200, "Secret Data")
})
}
示例 2:Viper 配置读取
func loadConfig() {
viper.SetConfigName("config")
viper.AddConfigPath(".")
viper.SetConfigType("yaml")
if err := viper.ReadInConfig(); err != nil {
panic(err)
}
fmt.Println("DB Host:", viper.GetString("database.host"))
}
// config.yaml内容:
// database:
// host: localhost
// port: 3306
示例 3:单元测试
// math.go
func Add(a, b int) int {
return a + b
}
// math_test.go
func TestAdd(t *testing.T) {
tests := []struct {
a, b, expected int
}{
{2, 3, 5},
{-1, 1, 0},
}
for _, test := range tests {
result := Add(test.a, test.b)
if result != test.expected {
t.Errorf("Add(%d, %d) = %d, 期望 %d",
test.a, test.b, result, test.expected)
}
}
}
第五章:实战项目(复杂场景)
项目 1:JWT 用户认证系统
// 生成JWT令牌
func GenerateToken(userID string) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"user_id": userID,
"exp": time.Now().Add(24 * time.Hour).Unix(),
})
return token.SignedString([]byte("your_secret_key"))
}
// 验证中间件
func JWTVerify() gin.HandlerFunc {
return func(c *gin.Context) {
tokenString := c.GetHeader("Authorization")
// 验证逻辑...
}
}
项目 2:GORM 事务处理
func TransferMoney(db *gorm.DB, from, to uint, amount float64) error {
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
// 扣款
if err := tx.Model(&Account{}).Where("id = ?", from).
Update("balance", gorm.Expr("balance - ?", amount)).Error; err != nil {
tx.Rollback()
return err
}
// 存款
if err := tx.Model(&Account{}).Where("id = ?", to).
Update("balance", gorm.Expr("balance + ?", amount)).Error; err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error
}
学习效果验证
完成所有示例后,尝试实现以下功能:
- 编写一个并发执行的网页爬虫,控制最大并发数为 5
- 使用 Gin+GORM 实现一个支持 CRUD 的 API 服务
- 开发一个命令行工具,支持配置文件读取和日志记录
明天再让 DeepSeek 给我生成一份 NextJS 的学习计划