Go语言怎么美化输出XML MarshalIndent用法
技术百科
幻夢星雲
发布时间:2026-01-17
浏览: 次 xml.MarshalIndent 无缩进是因为 indent 参数为空字符串;正确做法是传入非空 indent(如" "),且结构体字段需导出并配 xml tag。
Go 的 xml.MarshalIndent 为什么输出还是乱的?
直接用 xml.MarshalIndent 却没看到缩进?常见原因是:你传了空字符串 "" 当作前缀(prefix)或缩进符(indent),而 Go 要求至少一个非空字符串才能生效。它不会自动补空格,也不会 fallback 到默认缩进。
-
prefix是每行开头加的字符串(比如"前的缩进前缀,通常设为" "") -
indent才是真正控制层级缩进的字符(比如" "或"\t") - 如果
indent是空字符串(""),效果等同于xml.Marshal—— 零换行、零缩进
正确调用 xml.MarshalIndent 的最小可运行示例
注意:结构体字段必须导出(大写首字母),且建议加上 xml tag 显式控制命名和行为;否则默认会按字段名全大写输出,还可能漏掉私有字段。
package main
import (
"encoding/xml"
"fmt"
"os"
)
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
City string `xml:"city,omitempty"`
}
func main() {
p := Person{Name: "Alice", Age: 30, City: "Beijing"}
// ✅ 正确:indent 设为 " ",prefix 设为 ""
data, err := xml.MarshalIndent(p, "", " ")
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
fmt.Println(string(data))
}
输出会是带两级空格缩进的格式化 XML,而非挤在一行。
嵌套结构下缩进失效的典型原

当结构体包含切片或嵌套结构体时,xml 包默认不会为每个子元素单独缩进——它只按层级深度插入 indent 字符串,但若子元素没有显式 xml: tag 控制,或用了 xml:",any" 这类通配,就可能跳过缩进逻辑。
- 确保所有嵌套字段都导出,并有明确
xmltag(如`xml:"items>item"`) - 避免在结构体中混用
xml:",any"和正常字段:前者绕过结构体字段映射,MarshalIndent对其内部不递归缩进 - 切片字段必须用复数 tag(如
`xml:"item"`),否则会被当成单个元素,导致子项无包裹标签、缩进错位
想加 XML 声明头()怎么办?
xml.MarshalIndent 不生成 XML 声明。你需要手动拼接:
data, _ := xml.MarshalIndent(p, "", " ") output := []byte(xml.Header + string(data))
其中 xml.Header 是标准常量 "\n"。注意:如果目标接收方严格校验 XML 格式(如某些 SOAP 服务),漏掉声明可能导致解析失败。
缩进本身不难,难的是结构体定义和 tag 的配合;一个没导出的字段、一个漏写的 omitempty、一个空的 indent 字符串,都会让输出“看起来没美化”。
# ai
# go语言
# go
# 递归
# xml
# 字符串
# 为什么
# 结构体
# 常量
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php订单日志怎么记录发货_php记录订单发货操作
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Win11怎么更改输入法顺序_Win11调整语言首
- 如何在 Django 中修改用户密码后保持会话不丢
- Win10系统映像怎么恢复 Win10使用系统映像
- LINUX怎么进行文本内容搜索_Linux gre
- VSC怎么配置PHP的Xdebug_远程调试设置步
- MySQL 中使用 IF 和 CASE 实现查询字
- Windows10电脑怎么设置电源按钮_Win10
- Win11怎么开启自动HDR画质_Windows1
- Mac电脑进水了怎么办_MacBook进水后紧急处
- Python迭代器生成器进阶教程_节省内存与懒加载
- Win11 C盘满了怎么清理 Win11磁盘清理和
- Windows10如何更改盘符名称_Win10重命
- ACF 教程:正确更新嵌套在多层 Group 字段
- 如何有效拦截拼接式恶意域名的垃圾信息
- Python网络异常模拟_测试说明【指导】
- Win11讲述人怎么关闭_Win11误触开启语音朗
- Python配置文件操作教程_JSONINIYAM
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- PythonPandas数据分析教程_数据清洗与处
- 如何解决Windows字体显示模糊的问题?(Cle
- Golang如何遍历目录文件_Golang fil
- Win10怎样清理C盘爱奇艺缓存_Win10清理爱
- c++怎么处理多线程死锁_c++ lock_gua
- Win10系统怎么查看显卡温度_Win10任务管理
- Win11如何设置计划任务 Win11定时执行程序
- 如何关闭Win10自动更新更新_Win10系统自动
- php删除数据怎么加限制_带where条件删除避免
- Mac怎么设置登录项_Mac管理开机自启动程序【教
- c++怎么实现大文件的分块读写_c++ 文件指针s
- Go 中 defer 语句在 goroutine
- Win11怎么调整屏幕亮度_Windows 11调
- 如何提升Golang JSON序列化性能_Gola
- C++如何使用std::transform批量处理
- php订单日志怎么记录评价_php记录订单评价日志
- Win11如何设置自动关机 Win11定时关机命令
- Go 中 defer 在 goroutine 内部
- Win11如何设置电源计划_Win11电源计划优化
- Win10怎样清理C盘Steam游戏缓存_Win1
- 零基础学会Python自动化办公_高效处理Exce
- Win11怎么修改DNS服务器 Win11设置DN
- Win11怎么关闭用户账户控制UAC_Window
- Python抽象类与接口设计_规范说明【指导】
- Win11怎么关闭触摸键盘图标_Windows11
- 怎么将XML数据可视化 D3.js加载XML
- Win11怎么设置虚拟内存_Windows 11优
- Win11资源管理器卡顿怎么办 Win11文件资源
- Python与Docker容器化部署实战_镜像构建

QQ客服