用Go语言打造代码雨命令行工具

用Go语言实现代码雨命令行工具
🌟 效果抢先看
- 动态颜色渐变
- 随机二进制字符流
- 自适应终端尺寸
- 丝滑动画效果
🛠️ 环境准备
# 基础要求
1. Go 1.18+ 环境
2. 支持ANSI转义的终端(推荐iTerm2/WSL)
🔍 实现原理
核心逻辑
- 终端输出控制:
ANSI转义序列
控制光标/颜色
fmt.Print("\033[?25l") // 隐藏光标
fmt.Printf("\033[%d;1m%c", colorCode, char) // 设置颜色
- 时间定时:
time.Ticker
实现50ms刷新 - 随机字符生成:字符随机颜色渐变算法
idx := pos % len(colors)
color := colors[idx]
🧩 代码解析
四大核心模块
/* 代码结构示意图
main.go
├── 终端初始化/清理
├── 数据列管理
├── 动画逻辑
└── 渲染引擎
*/
func main() {
initTerminal()
defer cleanup()
initColumns()
ticker := time.NewTicker(delay)
defer ticker.Stop()
// 优雅退出
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
for {
select {
case <-ticker.C:
updateColumns()
render()
case <-sig:
return
}
}
}
关键技术点
- 替代屏幕缓冲区:避免闪烁
fmt.Print("\033[?1049h") // 进入替代缓冲区
defer fmt.Print("\033[?1049l") // 退出时恢复
- 随机字符生成:每秒2000+字符更新
r, _ := utf8.DecodeRuneInString(chars[rand.Intn(len(chars)):])
- 缓冲渲染:使用rune缓冲区提升性能
🚀 快速体验
# 克隆仓库 & 运行
git clone https://gitee.com/henry_sn/code-rain
cd code-rain
go run cmd/main.go
# 快捷键
Ctrl+C - 优雅退出
💡 定制你的代码雨
// 在const区域修改这些参数:
const (
chars = "01" // 代码雨字符集
maxLength = 20 // 雨滴长度
delay = 30*time.Millisecond // 速度调节
)
var colors = []int{32, 36, 35} // 修改颜色码(32=绿, 33=黄等)
💻 完整代码
// https://gitee.com/henry_sn/code-rain
🔧 常见问题
Q:为什么看不到颜色? A:请检查终端是否支持ANSI转义,尝试在WSL或iTerm2中运行
Q:如何实现横向滚动? A:修改render()中的遍历顺序,将x/y循环调换
🚴 进阶挑战
- 添加彩虹色模式(使用256色扩展)
- 实现触摸屏交互
- 添加背景音乐支持
