用 Go 写多线程粒子动画:踩坑终端显示与跨平台编译【含 Windows Terminal 配置 + Go 交叉编译脚本】

我本来想用Go语言写个终端粒子动画程序,直观展示Go多协程效果,想着 go run main.go 就能轻松看到成果,结果这过程中掉进了不少坑,今天就跟大家聊聊。

项目简要介绍

这个项目用Go语言实现了一个粒子系统,通过在终端绘制粒子动画来演示多协程效果,也是直观的测试channal和mutex的想法。粒子会随机移动、碰撞,还能变色。代码里用了结构体来定义粒子属性,像位置、速度、半径、颜色这些。还通过 sync.Mutex 保证并发访问数据的安全,用通道和定时器来协调不同的操作。比如粒子更新位置、检测碰撞以及绘制画面这些操作都是通过多协程并发进行的。

go 复制代码
// 粒子结构体
type Particle struct {
	id      int
	x, y    float64   // 位置
	vx, vy  float64   // 速度
	radius  float64   // 半径
	color   string    // 颜色代码
	updated chan bool // 用于通知更新的通道
	mutex   sync.Mutex
}

并且为了其中的脚本比较简单,我也只使用了系统库,所以呈现效果没那么好看,但是这不是今天的重点。

首次受挫:go build咋报错了?

我用 go build 编译出 .exe 文件,结果遇到了问题:

  1. 双击 .exe 文件,窗口闪一下就关闭了,因为双击会直接关闭终端。
  2. clear 清屏命令在Windows系统的CMD里不起作用。
  3. CMD版本对程序支持不好,需要下载Windows Terminal。

修复方法:

  1. 不能双击 .exe 文件,要在终端中运行程序。
  2. 去微软商店安装Windows Terminal,它对色彩和控制码支持良好。

新的挑战:程序能在macOS上跑吗?

由于网络原因,下载Windows Terminal很慢,又有事要换地方,我就向用Mac的朋友求助。我以为Go是跨平台语言,.exe 文件在Mac上也能运行,结果朋友运行时报错 -bash: ./particle.exe: cannot execute binary file。这才知道,Windows编译的 .exe 是PE格式,和macOS用的Mach - O格式完全不兼容。

正确做法:使用Go的交叉编译功能,在Windows上生成macOS可执行文件,命令如下:

cmd 复制代码
SET GOOS=darwin
SET GOARCH=arm64
SET CGO_ENABLED=0
go build -o particle_macOS particle.go
  • GOOS=darwin 表示目标系统是macOS。
  • GOARCH=arm64 适用于Apple Silicon芯片(M1/M2/M3),如果是Intel Mac则用 GOARCH=amd64。
  • CGO_ENABLED=0 可避免依赖C库,提升可移植性。

把 particle_macOS 发给朋友,他在终端运行 chmod +x particle_macOS 再 ./particle_macOS,动画就能正常运行,颜色、清屏、碰撞效果都没问题。

自动化:一键编译多平台

为避免每次手动设置环境变量,我写了两个批处理脚本:

  • build - windows.bat
bat 复制代码
set GOOS=windows
set GOARCH=amd64
set CGO_ENABLED=0
go build -o particle.exe
echo [✓] Windows 版本已生成
pause
  • build - macOS.bat
bat 复制代码
set GOOS=darwin
set GOARCH=arm64
set CGO_ENABLED=0
go build -o particle_macOS
echo [✓] macOS 版本已生成
pause

双击脚本即可生成对应平台的可执行文件,无需记忆复杂命令。

总结和建议

  1. 运行方式 :在Windows系统下,不要双击编译后的 .exe 文件,应在终端中运行程序,推荐使用Windows Terminal,它对程序的兼容性更好。
  2. 跨平台编译 :Go语言虽支持跨平台,但编译后的二进制文件格式因系统而异,如Windows的 .exe 和macOS的Mach - O格式不兼容。要实现跨平台运行,需使用Go的交叉编译功能,根据目标系统和架构设置 GOOS 和 GOARCH 环境变量。
  3. 自动化编译:为方便编译不同平台的可执行文件,可以编写批处理脚本,实现一键编译,提高开发效率。

最后,源码和脚本之后会放到github上,也会附上使用说明,记得提醒我填坑。

相关推荐
我的div丢了肿么办21 小时前
go语言对路由中的业务逻辑进行抽离
后端·go
孔令飞1 天前
1024程序员节,OneX平台送3套免费Go实战项目
云原生·go·ai编程
我不会起名字3221 天前
gRPC 拦截器写错:metadata 透传与超时注入的 3 个坑
微服务·go·grpc·拦截器
用户4015823324622 天前
对话一长,AI 就忘了你说过的话?Claude Code、Codex、Aider、WES Code 怎么压缩上下文
人工智能·go·ai编程
我的div丢了肿么办2 天前
go语言抽离路由文件以及对路由进行分组
后端·go
孔令飞2 天前
【OneX】OneX AI 工具安装、配置及功能介绍
云原生·go·ai编程
小满zs2 天前
Go语言第十四章(文件操作)
后端·go
vipxieliang2 天前
Go 1.24 工具链改进实战:工具依赖管理与 go vet 新分析器
后端·go
程序员爱钓鱼2 天前
Go 编程实战:Benchmark——基准测试、testing.B、benchmem、性能对比与代码优化实战
go·排序算法
Thinker QAQ3 天前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing