Go入门强调实践先行:装好即跑,go run一行命令输出“Hello, World!”即入门;需验证go version、GOPATH、GO111MODULE三环境变量;首文件须手动编写,理解package、import、main;变量声明优先用:=但限函数内;并发从go关键字起步,基础且必需。
go 不是“先学完语法再写代码”,而是装好就能跑,跑通就入门。你不需要 java 那套环境配置、maven 依赖、jvm 参数调优——go run 一行命令,fmt.println 一调,输出 “hello, world!” 就算正式进门槛了。
装完立刻验证:别跳过 go version
很多人卡在第一步不是因为不会装,而是没确认装对了。Windows 下载 MSI 安装包双击就行;Linux/macOS 用 wget + tar 解压后,必须补全三行环境变量:PATH(让系统找到 go 命令)、GOPATH(默认工作区)、GO111MODULE=on(强制启用模块管理)。漏掉任意一条,后续 go get 或 go build 都可能静默失败或拉错依赖。
-
go version输出带linux/amd64或darwin/arm64才算成功,只报command not found说明PATH没生效 -
go env GOPATH应该返回类似/home/xxx/go,不是空或$HOME/go字面量(那是没执行source) -
go list -m在空目录下运行,若报no modules是正常;若报cannot find module providing package,大概率是GO111MODULE没开
写第一个文件:别用 IDE 新建项目
VS Code 装了 Go 插件很香,但新手第一课必须手动建 hello.go ——不靠任何模板、不点“新建 Go Module”,就纯文本编辑器里敲四行:
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}然后终端进该目录,直接 go run hello.go。这一步绕不开:它强制你理解 package main 是可执行入口、import 是显式声明依赖、main() 是唯一启动函数。IDE 自动生成的 go.mod 文件反而会掩盖这些基础约束。
- 如果报
undefined: fmt,说明import "fmt"缺失或引号用了中文符号 - 如果报
missing function body,检查func main()后有没有漏掉左大括号{ - 不要提前加
go mod init myapp——没导入第三方包时,go.mod纯属冗余
变量声明:优先用 :=,但得知道它不能用在哪
var name string = "Alice" 和 name := "Alice" 效果一样,但后者更常用。关键限制是::= 只能在函数内部用,且左侧变量名必须是首次出现——这意味着你不能在包级(函数外)用它声明变量,也不能在 if 分支里重复声明同名变量。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
立即学习“go语言免费学习笔记(深入)”;
- 包级变量必须用
var,例如var port = 8080(类型可省略,由值推导) for i := 0; i 中的 <code>i是:=声明的局部变量,循环外不可见-
if x > 0 { y := 10 }里的y出了}就失效,外面fmt.Println(y)会编译报错
并发不是选修课:从 go 关键字开始练
Go 的并发不是“等你学会线程池再说”,而是和 if 一样基础。写个打印 1~3 的循环,加一行 go 就变成并发:
func main() {
for i := 1; i <= 3; i++ {
go fmt.Println(i) // 注意:这里会乱序甚至只打一个数
}
time.Sleep(time.Millisecond * 10) // 必须等 goroutine 执行完,否则主函数退出,goroutine 全杀
}这例子故意暴露问题:没有同步机制时,goroutine 执行不可控。但它让你立刻感知到 go 的轻量——不用 new Thread()、不用 start(),一个关键字就起一个“协程”。后续学 channel 或 sync.WaitGroup 才是为它收尾,而不是绕开它。
- 删掉
time.Sleep,大概率什么也不输出——主 goroutine 结束,程序立即退出 -
go fmt.Println(i)中的i是循环变量,闭包捕获的是地址,所有 goroutine 可能都打4(循环结束值),修复方式是传参:go func(n int) { fmt.Println(n) }(i) - 别一上来就写
select或context——先用go + time.Sleep感受调度,比看理论快十倍
真正卡住新手的,从来不是 goroutine 怎么写,而是 go run 报错时不知道该查哪一行环境变量、:= 在包级失效时硬生生改成 var 却忘了补类型、或者并发输出为空时以为代码错了,其实只是少了一行 time.Sleep。把这些“运行时瞬间”盯住,比读十页语法文档管用。

















