
开发工具【免费下载链接】pterm✨ PTerm is a modern Go module to easily beautify console output. Featuring charts, progressbars, tables, trees, text input, select menus and much more Its completely configurable and 100% cross-platform compatible.项目地址https://gitcode.com/gh_mirrors/pt/pterm点击查看免费下载PUtilsgithub.com/pterm/pterm/putils是 PTerm 官方提供的工具函数包把 PTerm 的各种能力封装成可直接调用的一键函数从结构体切片直接生成表格、把扁平层级列表渲染成树、带进度条的下载、ASCII 大字、Spinner 生命周期管理等都能在几行代码内完成。本文以 putils/README.md 及其生成模板 putils/README.template.md 为骨架结合 putils 目录下的全部源码与测试用例逐函数讲解 API 签名、底层实现原理和真实可运行的示例代码读完即可在自己的 Go CLI 项目中直接落地使用。PUtils 是什么为 PTerm 而生的开箱即用工具层在 putils/README.template.md 的开头项目给出了 PUtils 的准确定位Package putils contains utility functions for PTerm, to make its usage even easier! It contains pre-made functions, that utilize PTerm, to print various stuff to the terminal. You can use PUtils, to simplify various scenarios for which PTerm is frequently used.也就是说PTerm 负责如何渲染而 PUtils 负责替你准备好渲染所需的数据与流程。它的典型价值场景包括把一个[]Struct转成带表头的表格数据免去手写[][]string把原始 CSV / TSV 文本直接喂给表格渲染器用带缩进的多行字符串快速构造多级 Bullet List把Level Text扁平列表转成嵌套的TreeNode树结构让下载文件跑一段耗时任务这类过程自动带上进度条和 Spinner把十六进制颜色码转成 PTerm 的 RGB 真彩色对象用于大字标题或渐变色。包级文档定义在 putils/doc.go全包共 20 个导出函数全部构建在 pterm 基础打印能力之上。原文档还特别说明欢迎通过 Pull Request 贡献你自己的工具函数Feel free to contribute your utility functions via pull request!本文末尾会给出贡献路径。引入方式与 PTerm 相同只需一行 importimport github.com/pterm/pterm/putils函数总览19 个导出 API 完整清单putils/README.md 的 Util Functions 一节列出了完整签名按功能域划分如下文本与排版函数签名用途CenterTextCenterText(text string) string将多行文本按最长行居中BulletListFromStringBulletListFromString(s, padding string) pterm.BulletListPrinter从缩进文本生成 Bullet ListBulletListFromStringsBulletListFromStrings(s []string, padding string) pterm.BulletListPrinter从字符串切片生成 Bullet ListBulletListItemFromStringBulletListItemFromString(text, padding string) pterm.BulletListItem单行文本解析为列表项含层级LettersFromStringLettersFromString(text string) pterm.Letters生成默认主题样式的 ASCII 大字字母集LettersFromStringWithStyleLettersFromStringWithStyle(text string, style *pterm.Style) pterm.Letters为字母集应用自定义样式LettersFromStringWithRGBLettersFromStringWithRGB(text string, rgb pterm.RGB) pterm.Letters为字母集应用真彩色 RGB表格函数签名用途TableFromStructSliceTableFromStructSlice(tablePrinter pterm.TablePrinter, structSlice any) *pterm.TablePrinter用结构体切片填充自定义表格DefaultTableFromStructSliceDefaultTableFromStructSlice(structSlice any) *pterm.TablePrinter用结构体切片填充默认表格TableDataFromCSVTableDataFromCSV(csv string) pterm.TableDataCSV 字符串转表格数据TableDataFromTSVTableDataFromTSV(csv string) pterm.TableDataTSV 字符串转表格数据TableDataFromSeparatedValuesTableDataFromSeparatedValues(text, valueSeparator, rowSeparator string) pterm.TableData任意分隔符文本转表格数据树与异步任务函数签名用途TreeFromLeveledListTreeFromLeveledList(leveledListItems pterm.LeveledList) pterm.TreeNode扁平层级列表转树节点RunWithSpinnerRunWithSpinner(spinner *pterm.SpinnerPrinter, f func(spinner *pterm.SpinnerPrinter) error) error在 Spinner 运行期间执行函数RunWithDefaultSpinnerRunWithDefaultSpinner(initialSpinnerText string, f func(spinner *pterm.SpinnerPrinter) error) error用默认 Spinner 执行函数DownloadFileWithProgressbarDownloadFileWithProgressbar(progressbar *pterm.ProgressbarPrinter, outputPath, url string, mode os.FileMode) error带进度条下载文件DownloadFileWithDefaultProgressbarDownloadFileWithDefaultProgressbar(title, outputPath, url string, mode os.FileMode) error用默认进度条下载文件PrintAverageExecutionTimePrintAverageExecutionTime(count int, f func(i int) error) error多次执行并打印平均耗时颜色函数签名用途RGBFromHEXRGBFromHEX(hex string) (pterm.RGB, error)HEX 颜色码转 RGB 对象下面按类别逐组深入每一组都会给出源码实现依据与可直接运行的真实示例。文本与排版工具CenterText以最长行为基准的智能居中CenterText的实现位于 putils/center_text.go本质是对internal.CenterText(text, 0)的封装。宽度参数传0时由内部函数根据文本中最长一行的宽度自动计算见 internal/center_text.go 的GetStringMaxWidth。居中时需要注意的两个细节计算宽度时会剥离 ANSI 转义码RemoveEscapeCodes因此带颜色的文本也能正确居中不会把不可见的颜色序列计入宽度超过最大宽度的行会被自动拆分成多行再分别居中避免溢出。典型用法是与 PTerm 的DefaultCenter配合或在渲染前预处理一段说明文字centered : putils.CenterText(Hello\nPTerm) pterm.Println(centered)BulletList 系列用缩进字符串表达层级这一组函数把缩进即层级的直觉变成代码。核心是BulletListItemFromStringputils/bullet_list.go它调用内部函数internal.RemoveAndCountPrefix见 internal/remove_and_count_prefix.go统计文本开头有多少个连续的padding字符串把数量作为Level剩余部分作为Textfunc BulletListItemFromString(text string, padding string) pterm.BulletListItem { s, l : internal.RemoveAndCountPrefix(text, padding) return pterm.BulletListItem{Level: l, Text: s} }三个入口函数的关系很清晰BulletListFromString(s, padding)先按\n切行再逐行调用BulletListItemFromStringBulletListFromStrings([]string, padding)直接对切片逐行转换两者最终都返回*pterm.DefaultBulletList.WithItems(lis)即默认样式的 Bullet List 渲染器可直接链式.Render()。padding参数非常灵活可以是空格、Tab 甚至任意多字符串。测试用例putils/bullet_list_test.go覆盖了这些边界无缩进 →Level: 0两个空格padding 为 →Level: 2Tab 缩进padding 为\t→Level: 3文本内部的缩进不会被吞掉例如 item one解析为Level: 1、Text: item one。官方示例_examples/bulletlist/demo/main.go展示了两种写法等价// 方式一手写 Level 字段 items : []pterm.BulletListItem{ {Level: 0, Text: Level 0}, {Level: 1, Text: Level 1}, {Level: 2, Text: Level 2}, } pterm.DefaultBulletList.WithItems(items).Render() // 方式二从缩进字符串直接解析每个前导空格 1 级 text : 0 1 2 3 putils.BulletListFromString(text, ).Render()Letters 系列为 BigText 大字标题准备字母集LettersFromString系列服务于pterm.DefaultBigText把普通字符串拆成pterm.Letter序列bigtext_printer.go 中定义Letters是Letter的切片每个Letter持有String、Style和可选的RGB。三个变体的差异见 putils/letters_from_string.goLettersFromString(text)每个字母复用pterm.ThemeDefault.LetterStyle的指针测试 putils/letters_from_string_test.go 用assert.Same验证所有字母共享同一主题样式引用修改主题即可全局生效LettersFromStringWithStyle(text, style)为每个字母挂上自定义*pterm.Style适合做P青色、Term品红这种分段配色LettersFromStringWithRGB(text, rgb)改用pterm.RGB真彩色样式被覆盖为空Style{}适合需要精确色值如品牌色的场景。注意拆分是按rune而不是按字节测试验证LettersFromString(Gö日)会得到 3 个字母G、ö、日所以中文、emoji 等非 ASCII 字符也能被正确分割。官方示例_examples/bigtext/demo/main.go把三种用法一次呈现// 默认主题大字 pterm.DefaultBigText.WithLetters(putils.LettersFromString(PTerm)).Render() // 分段自定义样式 pterm.DefaultBigText.WithLetters( putils.LettersFromStringWithStyle(P, pterm.FgCyan.ToStyle()), putils.LettersFromStringWithStyle(Term, pterm.FgLightMagenta.ToStyle()), ).Render() // 真彩色 RGB终端不支持 TrueColor 时 PTerm 会自动降采样 pterm.DefaultBigText.WithLetters( putils.LettersFromStringWithRGB(PTerm, pterm.NewRGB(255, 215, 0)), ).Render()在完整演示程序 _examples/demo/demo/main.go 中LettersFromString甚至被用来实时渲染时钟大字每秒把time.Now().Format(15:04:05)转成字母集配合pterm.DefaultArea原地刷新实现终端里的动态大字时钟是这套 API 最典型的活用法。表格数据工具从结构体与分隔文本一步到位TableFromStructSlice反射驱动的结构体 → 表格TableFromStructSliceputils/tabledata-from-struct-slice.go用reflect自动把结构体切片变成pterm.TableData即[][]string定义在 table_printer.go。它的处理规则首行表头 结构体字段名每行数据 字段值经pterm.Sprintf(%v, ...)转成字符串同时支持结构体切片与指针结构体切片[]*T会被自动解引用入参不是切片、或元素不是结构体时原样返回传入的表格打印机不做任何修改返回的是填充好数据的新打印机指针不会污染全局pterm.DefaultTable测试 putils/tabledata_from_struct_slice_test.go 验证了不修改输入打印机和全局默认表保持不变两个约束。DefaultTableFromStructSlice则是TableFromStructSlice(pterm.DefaultTable, structSlice)的便捷版。官方示例_examples/table/from-structs/main.go展示了它有多省事——不需要任何 tag 或接口type User struct { Name string Age int Email string } users : []User{ {Name: Ada Lovelace, Age: 36, Email: adaexample.com}, {Name: Alan Turing, Age: 41, Email: alanexample.com}, {Name: Grace Hopper, Age: 85, Email: graceexample.com}, } // 字段名自动成为首行WithHasHeader 会为表头着色 putils.DefaultTableFromStructSlice(users).WithHasHeader().Render()TableDataFromCSV / TSV / SeparatedValues原始文本直转表格这一组是零解析成本的轻量转换器putils/tabledata_from_csv.go、putils/tabledata_from_tsv.go、putils/tabledata_from_separated_values.goTableDataFromCSV(csv)TableDataFromSeparatedValues(csv, ,, \n)TableDataFromTSV(csv)TableDataFromSeparatedValues(csv, \t, \n)TableDataFromSeparatedValues是底层实现按rowSeparator切行、再按valueSeparator切列拼成TableData。底层就是两个strings.Split新版 Go 用strings.SplitSeq因此它的行为边界很明确测试putils/tabledata_from_separated_values_test.go逐一验证过支持多字符分隔符如 | 、 || 支持 CRLF\r\n行分隔符不整齐的行、空字段都会被原样保留a;;c→ 中间是空字符串没有引号/转义机制a;b;c会被直接切开a、b、c字段内含分隔符的场景需要自行预处理空输入会产生一个空单元格行尾部行分隔符会产生一个空行。官方示例_examples/table/from-csv/main.gocsv : Firstname,Lastname,Email Paul,Dean,paulexample.com Callie,Mckay,callieexample.com Libby,Camacho,libbyexample.com pterm.DefaultTable.WithHasHeader().WithData(putils.TableDataFromCSV(csv)).Render()树结构工具TreeFromLeveledList 扁平列表转树TreeFromLeveledListputils/tree_from_leveled_list.go把pterm.LeveledList转成pterm.TreeNode。这两个类型都定义在 tree_printer.gotype TreeNode struct { Children []TreeNode Text string } type LeveledList []LeveledListItem type LeveledListItem struct { Level int Text string }转换算法有两个值得注意的健壮性处理均有测试佐证见 putils/tree_from_leveled_list_test.go负层级自动归零Level 0的条目会被修正为根层级避免越界层级跳跃被钳制相邻条目的层级最多只能增加 1如果直接Level: 5跳到深层会被收回到上一层 1防止生成断裂的树。官方示例_examples/tree/from-leveled-list/main.go模拟了一个文件系统最能说明扁平列表 vs 嵌套树的差异leveledList : pterm.LeveledList{ {Level: 0, Text: C:}, {Level: 1, Text: Users}, {Level: 1, Text: Windows}, {Level: 1, Text: dev}, {Level: 0, Text: D:}, {Level: 1, Text: Movies}, {Level: 2, Text: LinkinPark}, {Level: 2, Text: Games}, {Level: 3, Text: CallOfDuty}, } root : putils.TreeFromLeveledList(leveledList) root.Text Computer pterm.DefaultTree.WithRoot(root).Render()转换返回的根节点本身没有文本需要像上面那样手动指定root.Text。异步任务与反馈工具RunWithSpinner让任何函数自带转圈动画RunWithSpinnerputils/run-with-spinner.go封装了 Spinner 的标准生命周期先Start()再执行你的函数函数返回后自动Stop()——无论函数成功还是报错都会停且如果函数内部已经主动停过 SpinnerIsActive false不会重复 Stop 导致异常。func RunWithSpinner(spinner *pterm.SpinnerPrinter, f func(spinner *pterm.SpinnerPrinter) error) error { s, err : spinner.Start() if err ! nil { return err } err f(s) if s.IsActive { _ s.Stop() } return err }RunWithDefaultSpinner(initialSpinnerText, f)则是RunWithSpinner(pterm.DefaultSpinner.WithText(initialSpinnerText), f)的快捷版。测试 putils/run_with_spinner_test.go 验证了三点函数执行期间 Spinner 处于激活态、返回后必然停止、函数返回的错误会原样透传。典型用法err : putils.RunWithDefaultSpinner(正在安装依赖..., func(spinner *pterm.SpinnerPrinter) error { // 耗时操作期间可以 spinner.UpdateText(更新提示文字) return install() })DownloadFileWithProgressbar下载进度实时可见这个工具putils/download-with-progressbar.go把 HTTP 下载和 PTerm 进度条缝合在一起。实现上定义了一个progressbarWriter实现io.Writer每次写入都调用pb.Add(len(p))下载主体用io.Copy(out, io.TeeReader(resp.Body, counter))一边写文件一边计数。需要注意的几个硬性前提对应 putils/download_with_progressbar_test.go 中的错误分支依赖Content-Length响应头缺失时进度条无法初始化返回could not determine file size错误分块传输编码的响应会触发输出路径不可创建时返回could not create download path非 2xx 状态码、网络错误都会以带%w包装的错误返回下载完成后会用os.Chmod(path, mode)设置文件权限mode参数如0o600、0o755在测试中被验证会真实生效。err : putils.DownloadFileWithDefaultProgressbar( 下载 PTerm 源码, // 进度条标题 pterm.tar.gz, // 输出路径 https://example.com/x.tar.gz, // 下载地址 0o755, // 文件权限 )如果你已有定制进度条*pterm.ProgressbarPrinter用DownloadFileWithProgressbar传入即可复用同一套下载逻辑。PrintAverageExecutionTime一键输出函数平均耗时PrintAverageExecutionTimeputils/stats.go把函数执行count次并计时每次传入索引i累加耗时最后除以次数得到平均值用青色加粗样式打印Average execution time: ...。两个行为约束见 putils/stats_test.go任一一次调用返回错误就立即中止并透传错误、且不打印结果正常完成后才输出平均耗时。适合给 CLI 工具做基准测试或性能冒烟检查err : putils.PrintAverageExecutionTime(3, func(i int) error { time.Sleep(time.Millisecond * 100) return nil })颜色工具RGBFromHEX 十六进制转真彩色RGBFromHEXputils/rgb_from_hex.go把 HEX 字符串转成pterm.RGB{R, G, B}解析规则相当宽容自动小写化并去掉#和0x前缀支持 3 位缩写形式如#fba按规则展开为ffbbaa长度既不是 3 也不是 6 时返回预定义错误pterm.ErrHexCodeIsInvalid定义在 errors.gohex code is not valid含非十六进制字符时返回strconv解析错误。测试 putils/rgb_from_hex_test.go 覆盖了#ff0000、00ff00、0x0000ff、大小写混合、三色通道独立值以及#fba/fba/0xfba各种写法还有一整套非法长度与非法字符用例。使用示例rgb, err : putils.RGBFromHEX(#ffd700) // 金色 if err ! nil { panic(err) } pterm.NewStyle(rgb.ToStyle()).Println(Gold)得到pterm.RGB之后既可以直接喂给LettersFromStringWithRGB渲染大字也可以参与Fade渐变等高级效果。在真实项目中组合使用从 PTerm 演示程序看调用链PTerm 官方演示程序 _examples/demo/demo/main.go 是观察 PUtils 如何被组合进真实场景的最佳样本其中至少出现了两个 PUtils 函数开场 Logoputils.LettersFromStringWithStyle(P, ...)与putils.LettersFromStringWithStyle(Term, ...)拼接出双色 PTerm 大字动态时钟pterm.DefaultBigText.WithLetters(putils.LettersFromString(time.Now().Format(15:04:05))).Srender()生成大字后通过pterm.DefaultArea实现每秒原位刷新。如果你要跑这些示例仓库采用 Go Modules在仓库根目录执行go run ./_examples/...对应的子目录即可例如go run ./_examples/table/from-structs go run ./_examples/tree/from-leveled-list go run ./_examples/bulletlist/demo go run ./_examples/bigtext/demo如何贡献自己的工具函数按照 putils/README.md 的说明PUtils 定位是社区可共同维护的常用场景速成层——如果你在项目中反复手写某段 PTerm 调用它就有资格被提炼成工具函数。贡献方式在 putils 目录下新增xxx.go或扩充已有文件保持每个文件一个主题、带完整文档注释的命名习惯参考现有文件如 putils/bullet_list.go配套编写xxx_test.go测试覆盖边界行为现有 9 个测试文件是很好的模板例如 putils/tabledata_from_separated_values_test.go 用表驱动测试枚举边界把新函数签名补充进 putils/README.md 的 Util Functions 清单该文件由 putils/README.template.md 生成两者保持同步通过 Pull Request 提交即可让所有 PTerm 用户共享你的工具。小结PUtils 的价值在于把 PTerm 的能力转成结果从结构体到表格、从扁平列表到树、从字符串到大字字母集、从 URL 到带进度条的文件每一类高频场景都有一个签名精简、行为可测试、出错可诊断的封装函数。结合本文给出的源码路径你可以随时深入 putils 查看每一处实现细节或参考 _examples 中的可运行示例在自己的 CLI 项目中按需组合使用。赞分享开发工具【免费下载链接】pterm✨ PTerm is a modern Go module to easily beautify console output. Featuring charts, progressbars, tables, trees, text input, select menus and much more Its completely configurable and 100% cross-platform compatible.项目地址https://gitcode.com/gh_mirrors/pt/pterm点击查看免费下载相关推荐PTerm PUtils 实用工具包实战指南从表格转换到带进度条下载的一站式终端输出方案PTerm PUtils 实用工具包实战指南从表格转换到带进度条下载的一站式终端输出方案 本文面向 Go 开发者系统讲解 PTerm 官方配套工具包 PUt开发工具PTerm进度条完全指南10个实用技巧提升用户体验PTerm进度条完全指南10个实用技巧提升用户体验 PTerm作为一款现代化的Go模块专门用于美化控制台输出。其中 进度条 功能是提升用户体验的重要组件能开发工具rgf.win_def 包RGF 仓颉版开箱即用的 Win32 API 绑定与封装指南rgf.win_def 包RGF 仓颉版开箱即用的 Win32 API 绑定与封装指南 rgf.win_def 是 RGF 仓颉版RGF_CJ中面向 Wi图形学桌面应用上一篇Flowgram.ai CI/CD最佳实践自动化测试与部署流程下一篇彻底掌握Flowgram.ai状态机3步实现零代码工作流状态管理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考