DevCN
菜单
全部文章快讯开发深度热点

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后才会更新。这能帮助区分“修改源码”和“更新可执行文件”。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。