环境配置完成后应立即实操写代码,建立编辑→构建→运行→改错的完整反馈链,通过go mod init初始化模块、编写main.go并用go run执行、故意制造错误理解编译期检查机制,动手实践变量声明、多返回值、map初始化及for/range边界行为。

环境配置完成、go version 能正常输出,说明你已经跨过了第一道门槛。接下来不是继续调参数或换IDE,而是立刻写代码——语法入门必须紧贴实操,拖得越久越容易卡在“准备阶段”。
先跑通一个能编译、能调试、能改的最小闭环
很多人卡在“写了代码但不知道怎么验证”,本质是没建立从编辑→构建→运行→改错的完整反馈链。
- 用
go mod init初始化模块(哪怕只是go mod init hello),别跳过这步——Go 1.16+ 默认启用 modules,不初始化会导致导入失败或依赖混乱 - 写个带变量、函数、
fmt.Println的main.go,用go run main.go直接执行(不用先go build) - 故意把
fmt拼错成fmtt,看报错信息里是否出现undefined: fmtt——这是你第一次和 Go 编译器对话,它比你想象中更直白 - 删掉
fmtimport 但保留fmt.Println,观察错误是否变成undefined: fmt而非运行时 panic——Go 是编译期检查,这点和 Python/JS 完全不同
变量声明和类型推导必须动手试三遍
Go 的变量声明方式直接影响后续读开源代码的效率,光看文档不如亲手试错。
-
var a int = 10、a := 10、var a = 10这三种写法在函数内都合法,但:=不能用于包级变量(会报non-declaration statement outside function body) - 写个函数返回两个值:
func foo() (int, string) { return 42, "hello" },然后用a, b := foo()接收——多返回值不是语法糖,是语言原生能力 - 声明一个空 map:
m := make(map[string]int),直接m["key"] = 1不会 panic;但若写成var m map[string]int再赋值,运行时会 crash 报panic: assignment to entry in nil map
for 和 range 别背语法,先搞清边界行为
Go 的 for 是唯一循环结构,range 看似简单,但 slice 和 map 的遍历行为差异极易引发 bug。
立即学习“go语言免费学习笔记(深入)”;
- 对 slice 用
for i := range s,拿到的是索引;用for i, v := range s,v是值的副本——修改v不影响原 slice - 对 map 用
for k, v := range m,k和v都是副本,且每次遍历顺序不保证(Go 1.0 起就明确不保证 map 遍历顺序) - 写个
for ; i 然后在循环里 <code>break或continue,确认它们的行为和 C/Java 一致——Go 没有 while,但for可以完全替代
真正难的不是记住 := 和 var 的区别,而是习惯编译器在你敲下保存那一刻就告诉你“这里不对”。所有语法细节都会在写真实逻辑时反复暴露,现在只要确保每次改一行代码,都能立刻看到结果或错误就行。


















