go 1.21+ 默认启用模块模式,无需配置 gopath;需验证 go version 和 go env goproxy,确保代理可用;用 net/http 快速验证 web 服务,再引入 gin 处理 json;注意端口冲突、代理失效和 go.sum 生成问题。

Go 1.21+ 已内置 go mod,无需手动配置 GOPATH,直接用模块模式初始化项目即可——这是当前最稳妥、最不易出错的起点。
确认 Go 版本并验证安装是否可用
很多“环境没搭好”的问题其实卡在 Go 本身没装对。先运行:
go version
输出应类似 go version go1.22.3 darwin/arm64(或 windows/amd64 等)。若报 command not found,说明 go 未加入 PATH;macOS/Linux 检查 ~/.zshrc 或 ~/.bash_profile 是否有 export PATH=$PATH:/usr/local/go/bin;Windows 则检查系统环境变量中 Path 是否含 C:\Go\bin。
- 别用第三方包管理器(如 Chocolatey、Homebrew)装完就以为万事大吉——务必手动验证
go env GOPROXY,确保有代理(如https://goproxy.cn),否则go get会超时 - Windows 用户注意:CMD 和 PowerShell 的环境变量加载行为不同,建议统一用 PowerShell 测试
-
go env -w GO111MODULE=on不再需要,1.16+ 默认开启模块模式
用 net/http 快速起一个可访问的 Web 服务
不急着上 Gin/Echo,先用标准库跑通请求生命周期。新建目录 hello-web,执行:
go mod init hello-web
然后创建 main.go:
package main
import (
"fmt"
"log"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello from %s", r.URL.Path)
}
func main() {
http.HandleFunc("/", handler)
log.Println("Server starting on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
运行 go run main.go,访问 http://localhost:8080/test 应返回对应路径文本。
- 端口被占用?错误信息是
listen tcp :8080: bind: address already in use,换端口即可,比如:8081 - 浏览器打不开但
curl -v http://localhost:8080有响应?检查是否启用了代理或防火墙拦截了 localhost -
http.ListenAndServe第二个参数为nil表示使用默认http.DefaultServeMux,适合简单路由;复杂场景建议显式传入自定义http.ServeMux
引入 Gin 并处理 JSON 请求
确认基础 Web 能跑后,再加框架。在同目录下执行:
go get -u github.com/gin-gonic/gin
修改 main.go:
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "pong"})
})
r.POST("/echo", func(c *gin.Context) {
var json struct{ Text string `json:"text"` }
if err := c.ShouldBindJSON(&json); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
c.JSON(200, gin.H{"received": json.Text})
})
r.Run(":8080")
}
启动后,用 curl -X POST http://localhost:8080/echo -H "Content-Type: application/json" -d '{"text":"hi"}' 测试。
-
go get后没生成go.sum?说明模块校验失败,检查GO111MODULE是否意外关闭,或代理是否返回 404 - Gin 的
c.ShouldBindJSON不会自动终止请求,必须显式return,否则后续代码仍会执行 -
gin.Default()自带日志和恢复中间件,生产环境需替换为gin.New()并按需注册中间件
真正容易卡住的不是语法,而是模块代理失效、本地端口冲突、或 IDE 缓存了旧的 go.mod 导致依赖解析异常——遇到问题优先看终端第一行报错,而不是直接重装 Go。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











