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


用Go语言实现代码雨命令行工具

代码雨效果示意图

🌟 效果抢先看

  • 动态颜色渐变
  • 随机二进制字符流
  • 自适应终端尺寸
  • 丝滑动画效果

🛠️ 环境准备

# 基础要求
1. Go 1.18+ 环境
2. 支持ANSI转义的终端(推荐iTerm2/WSL)

🔍 实现原理

核心逻辑

  1. 终端输出控制ANSI转义序列控制光标/颜色
fmt.Print("\033[?25l") // 隐藏光标
fmt.Printf("\033[%d;1m%c", colorCode, char) // 设置颜色
  1. 时间定时time.Ticker实现50ms刷新
  2. 随机字符生成:字符随机颜色渐变算法
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
		}
	}
}

关键技术点

  1. 替代屏幕缓冲区:避免闪烁
fmt.Print("\033[?1049h") // 进入替代缓冲区
defer fmt.Print("\033[?1049l") // 退出时恢复
  1. 随机字符生成:每秒2000+字符更新
r, _ := utf8.DecodeRuneInString(chars[rand.Intn(len(chars)):])
  1. 缓冲渲染:使用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循环调换

🚴 进阶挑战

  1. 添加彩虹色模式(使用256色扩展)
  2. 实现触摸屏交互
  3. 添加背景音乐支持
wx

关注公众号

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo