go写hello world需严格满足package main和func main(),用go run快速验证,go build生成跨平台静态二进制,init()在main前执行。

直接上手写 main.go,别等“学完语法再开始”——Go 的设计哲学就是边写边学,越早接触真实编译错误和运行行为,越快建立直觉。
从 go run main.go 开始,而不是配置 IDE 或项目结构
新手最容易卡在环境配置、插件安装、工作区路径(GOPATH vs Go Modules)上。其实 Go 1.16+ 默认启用模块模式,只要目录里有 go.mod(go init myapp 自动生成),就能跑起来。
- 新建空文件夹,执行
go mod init myapp,生成最简go.mod - 写一个
main.go,内容就三行:package main、import "fmt"、func main() { fmt.Println("ok") } - 终端执行
go run main.go—— 成功输出即代表环境就绪 - 后续所有命令(
go build、go test)都基于当前模块,不用管GOPATH
IDE 插件(如 VS Code 的 Go 扩展)建议等能稳定跑通命令行后再装;强行提前配置,反而容易因 gopls 版本错位或缓存污染导致代码补全失效、跳转失败。
json.Marshal 和 json.Unmarshal 别裸用结构体字段
刚接触序列化时,常把结构体字段名直接当 JSON key 用,结果 API 返回字段是 user_name,Go 里却写 UserName string,一解码就为空。根本原因是 Go 默认按导出字段名首字母大写映射,不加 tag 就是驼峰转蛇形的“猜测”,不可靠。
- 所有参与 JSON 编解码的结构体字段,必须显式加
jsontag,例如:Name string `json:"name"` - 需要忽略零值字段(如空字符串、0 值 int)时,追加
omitempty:Age int `json:"age,omitempty"` - 嵌套结构体字段也要打 tag,不能只在外层打:
User User `json:"user"`,且User自身字段也需 tag - 如果后端返回的是
created_at时间戳字符串,别用time.Time直接接收——它默认只认 RFC3339 格式;要么加自定义UnmarshalJSON方法,要么先用string接,再手动解析
goroutine 启动后别忘了同步,go func(){}() 很危险
新手复制粘贴 go func(){ ... }() 后发现程序一闪而过、打印没出来、文件没写完——因为主 goroutine 已经退出,整个进程终止,其他 goroutine 被强制杀死。
- 简单场景用
sync.WaitGroup:在启动前wg.Add(1),goroutine 结尾调wg.Done(),主函数末尾wg.Wait() - 别用
time.Sleep等待,它不可靠(时间难估、测试难断言) - 涉及数据传递,优先走
channel,而不是共享变量 +mutex;例如要收集 5 个 HTTP 请求结果,开 5 个 goroutine 写入同一个chan Result,主 goroutine 用for i := 0; i 收集 - 启动大量 goroutine(比如循环里
go doWork(i))时,务必限制并发数,否则可能耗尽文件描述符或内存;用带缓冲的 channel 当信号量,或直接用semaphore库
标准库比第三方库更值得优先信任
Go 生态里很多功能,标准库已足够好,但新手常因“看到别人用了 xxx 库”就盲目引入,结果增加维护负担、版本冲突风险,甚至引入隐蔽 bug。
- HTTP 客户端/服务端:坚持用
net/http,不要一上来就换gin或echo;它们只是封装,掩盖了底层连接复用、超时控制等关键细节 - JSON 处理:标准
encoding/json性能够用、行为确定;msgpack或easyjson只在明确压测证明 JSON 是瓶颈时才考虑 - 配置加载:小项目用
flag或os.Getenv;中大型项目用github.com/spf13/viper没问题,但别为了读一个config.json就引入 20+ 依赖 - 日志:
log包够教学和简单服务用;上生产才切到zap或zerolog,且要理解它们为何更快(结构化、避免反射、预分配)
真正容易被忽略的是:标准库文档(pkg.go.dev)里的 Example 和 Source 链接,比多数教程更准确。遇到不确定的行为,直接看源码里 json.Unmarshal 怎么处理 nil slice,比查 Stack Overflow 快且可靠。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











