Go 入门:从创建项目到运行可执行文件
独立完成一个Go命令行项目:准备目录、初始化模块、保存源码、运行程序,再生成可执行文件。学完后,应能说清go.mod、main.go和编译产物分别负责什么。
本节目标
独立完成一个Go命令行项目:准备目录、初始化模块、保存源码、运行程序,再生成可执行文件。学完后,应能说清go.mod、main.go和编译产物分别负责什么。
前置知识
不要求Go基础。需要能够打开终端、创建文件,并已安装Go。编辑器任选,不依赖特定插件。
准备与运行
在一个新的练习目录执行以下命令。目录名可以修改;若该目录已经初始化过模块,不要重复执行go mod init。
mkdir go-lesson-01
cd go-lesson-01
go mod init example.com/devcn/lesson01将下方完整代码保存为当前目录的main.go,然后执行:
go fmt ./...
go run .先用go version确认工具链可用。本例在Go 1.25.7、macOS ARM64环境验证,只使用标准库;没有测试所有操作系统和Go版本。
核心概念
一个最小项目包含两类文件:go.mod描述模块身份和Go版本要求,main.go保存程序代码。模块路径是代码组织与依赖引用使用的名字;本地练习使用example.com前缀,不需要购买域名,也不需要部署网站。
可执行程序使用package main,并提供没有参数和返回值的main函数。import声明依赖的包,本例使用标准库fmt输出文字。标准库随Go工具链提供,因此本例不用下载第三方依赖。
go run .会编译并运行当前目录的程序,适合验证改动;go build -o lesson .生成名为lesson的文件,适合反复执行或分发给相同目标环境。不要把“源码可以在不同系统编译”理解成“一个编译产物能在所有系统直接运行”。
完整示例
package main
import "fmt"
func main() { fmt.Println("DevCN Go practice") }运行后应得到:
DevCN Go practice代码如何工作
先看第一行:package main表明这是可执行程序所属的包。第二部分只导入真正使用的fmt;Go会检查没有使用的导入,减少无效依赖。
程序启动后进入main,调用fmt.Println输出一行文字并换行。花括号标记函数体,大小写是名称的一部分,Println不能写成println来当作同一个库函数。
得到预期输出后,再执行go build -o lesson .。macOS/Linux可运行./lesson;Windows建议使用go build -o lesson.exe .再执行.\lesson.exe。改变输出文本后必须重新构建,旧的可执行文件不会自动更新。
常见错误与边界
- 找不到go命令:先完成Go安装,重新打开终端,确认
go version能够输出版本。 - 提示找不到go.mod:用终端查看当前位置,切换到初始化过模块的目录,不要在源文件旁边随意新建多个模块。
- 出现“imported and not used”:删除未使用的import,或补上实际调用。
- 修改源码但执行结果没变:确认保存了文件,并重新运行go run或go build。
本节只验证本地运行,没有配置Web服务、端口监听或部署环境。
练习
把程序改成输出两行:第一行是“开始学习Go”,第二行是“今日目标:完成一个程序”。分别用go run和编译产物运行。
参考答案
将main函数体改为下面两次调用,其余部分保留:
fmt.Println("开始学习Go")
fmt.Println("今日目标:完成一个程序")预期得到两行文本。再把第二行的目标改掉,只执行旧的编译产物,输出仍然是旧内容;重新go build后才会更新。这能帮助区分“修改源码”和“更新可执行文件”。
文章回复
0 条公开回复