Go Tour 切片练习本地运行踩坑全记录(从报错到成功运行)
最近在做 Go 官方 Tour 的切片(Slices)练习时,遇到了一系列依赖下载和运行报错,折腾了一番终于成功跑通。整理了完整的踩坑过程和解决方案,希望能帮到和我一样在本地练习 Go Tour 的,避免走重复弯路。
先简单介绍下背景:我使用的是 WSL + Ubuntu + Docker 开发环境,搭配 VS Code,本地已初始化 Go 模块,练习目录结构为 /app/go-tour/(根目录有 go.mod),切片练习代码放在 /app/go-tour/exercies-slices/main.go,目标是运行代码生成图片,完成 Pic 函数的实现。
一、练习目标与初始代码
本次练习的核心需求:实现 Pic 函数,返回一个长度为 dy 的切片,每个元素是长度为 dx 的 8 位无符号整数切片([][]uint8),运行程序后会将这些整数解析为灰度(蓝阶)值,显示出对应的图片。
初始可运行代码(最终可成功运行版本):
package main
import "golang.org/x/tour/pic"
// Pic 函数:生成 dx * dy 的图片切片
func Pic(dx, dy int) [][]uint8 {
// 创建外层切片,长度 dy
image := make([][]uint8, dy)
// 遍历每一行
for y := range image {
// 创建每一行的切片,长度 dx
row := make([]uint8, dx)
// 遍历每一列
for x := range row {
// 你可以任选下面一种公式,效果不同
// row[x] = uint8((x + y) / 2) // 渐变
// row[x] = uint8(x * y) // 格子状
row[x] = uint8(x ^ y) // 斜纹(最漂亮)
}
image[y] = row
}
return image
}
func main() {
pic.Show(Pic)
}
二、完整踩坑过程(报错 → 排查 → 解决)
- 第一次运行:缺少依赖包报错
进入练习目录,直接运行代码,首先遇到的是依赖缺失报错:如图1


/app/go-tour/exercies-slices # go run main.go
main.go:3:8: no required module provides package golang.org/x/tour/pic; to add it:
go get golang.org/x/tour/pic
原因很明显:代码中导入了golang.org/x/tour/pic 包,但本地没有安装这个依赖,Go 提示我们通过 go get 命令安装。
- 安装依赖:502 Bad Gateway 报错
按照提示,切换到 go-tour 根目录(因为根目录有 go.mod,可统一管理依赖),执行安装命令,却遇到了 502 错误:如图2
/app/go-tour # go get golang.org/x/tour/pic go: golang.org/x/tour/pic: module golang.org/x/tour: reading https://goproxy.io/golang.org/x/tour/@v/list: 502 Bad Gateway server response: error code: 502
这里我一开始有点困惑,因为我本地已经可以翻墙,Google 也能正常访问,为什么还会报 502?后来排查发现,是因为系统环境变量中设置了 GOPROXY(国内代理 goproxy.io),而 golang.org/x/tour 是 Go 官方教程的专属包,大部分国内公共代理并没有缓存这个包,导致代理访问失败,返回 502。
- 尝试修改 GOPROXY:无法覆盖系统环境变量
既然国内代理不行,我想着将 GOPROXY 改为 direct(直接访问官方源),执行以下命令:
/app/go-tour # go env -w GOPROXY=direct warning: go env -w GOPROXY=… does not override conflicting OS environment variable
又出现了新的警告:go env -w 无法覆盖系统环境变量中已设置的 GOPROXY。这说明系统层面强制设置了 GOPROXY,通过 go env -w 无法修改,必须先取消系统环境变量中的 GOPROXY。
- 取消 GOPROXY:成功安装依赖
既然无法修改,那就临时取消系统环境变量中的 GOPROXY,让 Go 直接走翻墙网络访问官方源,执行以下命令:
/app/go-tour # unset GOPROXY /app/go-tour # go get golang.org/x/tour/pic go: downloading golang.org/x/tour v0.1.0 go: added golang.org/x/tour v0.1.0
这次终于成功了!可以看到 Go 成功下载了 golang.org/x/tour v0.1.0 版本,并将其添加到了项目依赖中(更新到 go.mod 和 go.sum)。
- 再次运行:成功生成图片
依赖安装完成后,再次切换到练习目录运行代码:
/app/go-tour # cd exercies-slices/
/app/go-tour/exercies-slices # go run main.go
IMAGE:iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAEEElEQVR42uzdQYrrMBCE4ZbJxXW0PkqOkGUWwcPADMwsvPBCxlJ/YH6KQhjzYJ5SqbT1iNhbC5er5rW1FvseiDX5+P4j2OLz+f2DoOlK2g6AdoDt58/i/f7/8YjPX923A6AdwGdBWgZArJ4B/l6v1/FXp9Zbv8p6OwDaAXwWpGUARD2A74n5egBEGYCmZQDEqj3A0fV8nv/Jtfu7/13vbwdAO4DPgrQMgKgH8D0xXw+AKAPQtAyAaB7A78utNw+AKAPQtAyAqAfg8/UAiDIATcsAiFXmAc5emTH8Fe+e3/M7HwBRBqBpGQBRD8Dn6wEQZQCalgEQzQNYb70eAFEGoGkZAFEPwNcD+J8AZQCfC2kZAFEP4P3x7u98AEQZgKZlAEQ9AJ+vB0CUAWhaBkA0D2C99eYBEGUAmpYBEPUAfL4eAFEGoGkZALH6+QCjr94nfvgL3q/v3988AKIMQNMyAKIegM+XARBlAJq2A6AdwO/FrTcPgCgD0LQMgKgH4PP1AIgyAE3LAIjmAcL76d3f+QCIMgBNywCIegA+Xw+AKAPQtAyAaB7AeuvNAyDKADQtAyDqAfh8PQCiDEDTMgBiifMBMmPq9+t7/rWf3w6AdgCfBWkZAFEP4Htivh4AUQagaRkA0TyA35dbbx4AUQagaRkAUQ/A5+sBEGUAmpYBEJ0PEN5P7/7OB0CUAWhaBkDUA/D5egBEGYCmZQBE8wDWW28eAFEGoGkZAFEPwOfrARBlAJqWARAXOR/A5brzZQdAO4DPgrQMgKgH8D0xXw+AKAPQtAyAaB7A78utNw+AKAPQtAyAqAfg8/UAiDIATcsAiM4HCO+nd3/nAyDKADQtAyDqAfh8PQCiDEDTMgCieQDrrTcPgCgD0LQMgKgH4PP1AIgyAE3LAIiLnA+QGcNf8e75Pb/zARBlAJqWARD1AHy+HgBRBqBpGQDRPID11usBEGUAmpYBEPUAfD2A/wlQBvC5kJYBEPUA3h/v/s4HQJQBaFoGQNQD8Pl6AEQZgKZlAETzANZbbx4AUQagaRkAUQ/A5+sBEGUAmpYBEKufDzD66n3ih7/g/fr+/c0DIMoANC0DIOoB+HwZAFEGoGk7ANoB/F7cevMAiDIATcsAiHoAPl8PgCgD0LQMgGgeILyf3v2dD4AoA9C0DICoB+Dz9QCIMgBNywCI5gGst948AKIMQNMyAKIegM/XAyDKADQtAyCWOB8gM6Z+v77nX/v57QBoB/BZkJYBEPUAvifm6wEQZQCalgEQzQP4fbn15gEQZQCalgEQ9QB8vh4AUQagaRkA0fkA4f307u98AEQZgKZlAEQ9AJ+vB0CUAWhaBkA0D2C99eYBEGUAmpYBEPUAfL4eAFEGoGkZAPEafgUAAP//2P/knioA0wcAAAAASUVORK5CYII=
看到输出一串 IMAGE 开头的 Base64 编码,就说明运行成功了!这段编码就是图片的二进制数据,直接复制到浏览器地址栏(或用在线 Base64 转图片工具),就能看到我们用 x^y 生成的斜纹图片。
三、关键知识点与解决方案总结
- 核心报错原因梳理
- 报错 1(缺少依赖):no required module provides package golang.org/x/tour/pic → 未安装对应依赖包,需用 go get 安装。
- 报错 2(502 Bad Gateway):国内 GOPROXY 未缓存 golang.org/x/tour 包,导致下载失败。
- 警告(无法修改 GOPROXY):系统环境变量中已设置 GOPROXY,go env -w 无法覆盖,需临时取消。
- 通用解决方案(适用于所有 Go Tour 练习)
如果你也能翻墙,且遇到类似的依赖下载问题,直接按以下步骤操作即可: - 切换到 Go Tour 项目根目录(确保根目录有 go.mod 文件):cd /app/go-tour
- 临时取消系统环境变量中的 GOPROXY:unset GOPROXY(仅当前终端生效)
- 安装所需依赖:go get golang.org/x/tour/pic(其他练习依赖也可按此方法安装)
- 切换到练习目录,运行代码:go run main.go
- 补充说明
- 关于 GOPROXY:如果没有翻墙,可切换为国内可用的代理(如 go env -w GOPROXY=https://goproxy.cn,direct),但部分官方包(如 tour)可能仍无法下载,建议优先使用翻墙 + 取消 GOPROXY 的方式。
- 关于依赖共用:在 go-tour 根目录安装一次依赖后,所有子目录的练习(如 exercies-slices、exercies-maps 等)都能共用该依赖,无需重复安装。
- 图片查看:运行后输出的 Base64 编码,可复制到 Base64 转图片工具,一键生成图片查看效果。
四、总结
这次踩坑让我深刻理解了 Go modules 的依赖管理逻辑,以及 GOPROXY 代理的作用和使用场景。其实问题的核心很简单:能翻墙的情况下,无需依赖国内代理,取消 GOPROXY 让 Go 直接访问官方源,就能顺利下载所有官方依赖。
对于 Go 初学者来说,本地练习官方 Tour 是巩固基础的好方法,但遇到依赖问题不要慌,按步骤排查,重点关注 GOPROXY 和依赖安装路径,就能快速解决。后续我也会持续整理 Go 学习过程中的踩坑记录,欢迎大家一起交流学习~
最后附上我的练习代码仓库:github.com/shuijingwan/go-gin-learning,包含 Go Tour 所有练习的本地可运行版本,感兴趣的可以参考。