0

0

如何在Golang中开发一个JSON格式化工具 Go语言命令行管道处理

P粉602998670

P粉602998670

发布时间:2026-03-11 14:14:03

|

278人浏览过

|

来源于php中文网

原创

应先用os.stdin.stat()判断是否为管道输入:(stat.mode() & os.modechardevice) == 0成立才读取,避免readall阻塞;支持管道与文件双模式时优先处理命令行参数,无参数再检查stdin就绪。

如何在golang中开发一个json格式化工具 go语言命令行管道处理

怎么用 os.Stdin 读取管道输入而不卡住

Go 程序从管道读取 JSON 时,如果没判断输入来源,os.Stdin 在无输入时会一直阻塞,导致命令行“假死”。这不是 bug,是 Unix 管道的正常行为:stdin 没被关闭,ReadAll 就不返回。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • stat, _ := os.Stdin.Stat() 判断是否为管道:(stat.Mode() & os.ModeCharDevice) == 0 成立才表示有管道输入
  • 别直接 ioutil.ReadAll(os.Stdin) —— 改用带超时或条件检查的读法,比如先 bufio.NewReader(os.Stdin).ReadBytes('\n') 尝试读一行,再根据是否 EOF 决定是否继续
  • 如果用户既想支持管道(cat data.json | gojsonfmt),又想支持文件参数(gojsonfmt data.json),优先处理命令行参数,没参数再查 stdin 是否就绪

json.Indentjson.MarshalIndent 选哪个

两者都格式化,但语义和使用场景完全不同,混用会导致输出异常或 panic。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • json.MarshalIndent 是“序列化 + 格式化”,适用于你有 Go struct 或 map,想转成缩进 JSON 字符串;它内部会做类型检查、转义、编码
  • json.Indent 是“纯格式化”,输入必须是合法 JSON 字节流([]byte),只负责加缩进、换行,不做解析校验;适合管道场景:原始输入已经是 JSON,只是没排版
  • 如果你用 json.Indent 处理含语法错误的 JSON,它会直接 panic 并报 invalid character —— 这是预期行为,不是库问题
  • 示例:正确用法是 json.Indent(buf.Bytes(), nil, "", " "),其中第二个参数 nil 表示不加前缀,第四个是缩进字符串

如何让工具兼容不换行的流式 JSON(如 NDJSON)

标准 json.Indent 要求整个输入是一份完整 JSON(对象或数组),遇到每行一个 JSON 对象(NDJSON)会失败,报 invalid character '\n' after top-level value

纳米漫剧流水线
纳米漫剧流水线

360推出的国内首个工业级AI漫剧生产平台

下载

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 不要试图用单次 json.Indent 处理多行 JSON;改用逐行解析:scanner := bufio.NewScanner(os.Stdin),对每行调用 json.Valid 校验后再 json.Indent
  • 注意空行和注释:JSON 标准不支持行内注释,但有些前端工具输出带 // 的伪 JSON;json.Valid 会直接返回 false,需提前清理或跳过
  • 性能上,逐行处理比一次性读全更省内存,尤其适合日志类大流量 JSON 流

为什么 go run main.go 管道处理失败,而编译后正常

不是 Go 版本或代码问题,是 shell 启动方式差异导致的 stdin 继承异常。用 go run 时,Go 工具链会 fork 新进程执行,某些 shell(尤其是 zsh + oh-my-zsh 插件组合)可能重置或延迟传递 stdin 状态。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 调试阶段统一用 go build -o fmtjson && cat data.json | ./fmtjson 验证逻辑,避免被 go run 的环境干扰
  • 如果坚持用 go run 测试,加 -ldflags="-s -w" 减少符号干扰,并确保终端未启用 stty -icanon 类似设置
  • 真正上线部署时,永远用编译后的二进制——这不仅是管道问题,还涉及 CGO、资源限制、信号处理等隐性差异

最常被忽略的是:开发时在 IDE 终端里跑管道命令,IDE 自己的 shell 环境可能禁用了管道继承,这时候连 os.Stdin.Stat() 都拿不到有效 mode,得切到原生终端验证。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

247

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

356

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

214

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

409

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

490

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

200

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

1438

2025.06.17

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 6.1万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号