0

0

在 Go 中使用 DRY 原则处理 XML 结构体标签

聖光之護

聖光之護

发布时间:2025-10-09 09:39:31

|

476人浏览过

|

来源于php中文网

原创

在 go 中使用 dry 原则处理 xml 结构体标签

在 Go 语言中解析 XML 数据时,经常会遇到需要在多个结构体中定义相同字段和 XML 标签的情况,例如,每个结构体都包含一个 Description 字段,并使用相同的 xml:"description,omitempty" 标签。为了避免重复定义,可以使用嵌入带有结构体标签的公共结构体的方式,实现代码的 DRY (Don't Repeat Yourself) 原则。

嵌入结构体

我们可以创建一个包含公共字段和标签的结构体,然后将其嵌入到其他结构体中。例如,创建一个名为 describable 的结构体,其中包含 Description 字段和 xml:"description" 标签:

type describable struct{
    Description string `xml:"description"`
}

然后,可以将 describable 结构体嵌入到其他结构体中,例如 subobjA 和 subobjB:

type subobjA struct {
    describable
    XMLName     xml.Name `xml:"subobjA"`
}

type subobjB struct {
    describable
    XMLName     xml.Name `xml:"subobjB"`
}

type obj struct {
    XMLName     xml.Name `xml:"obj"`
    A           subobjA
    B           subobjB
}

通过这种方式,subobjA 和 subobjB 结构体都继承了 Description 字段和 xml:"description" 标签,避免了重复定义。

字段提升

需要注意的是,嵌入结构体中的字段会被提升到外部结构体,可以直接通过外部结构体访问。例如,可以通过 sampleObj.Description 访问 sampleObj.describable.Description。

Go 语言规范中对字段提升的定义如下:

Remover
Remover

几秒钟去除图中不需要的元素

下载
A field or method f of an anonymous field in a struct x is called promoted if x.f is a legal selector that denotes that field or method f.Promoted fields act like ordinary fields of a struct except that they cannot be used as field names in composite literals of the struct.

这意味着,嵌入结构体中的字段可以像普通字段一样使用,但不能在结构体字面量中使用。

示例代码

以下是一个完整的示例代码,演示了如何使用嵌入结构体来解析 XML 数据:

package main

import (
    "encoding/xml"
    "fmt"
)

type describable struct {
    Description string `xml:"description"`
}

type subobjA struct {
    describable
    XMLName xml.Name `xml:"subobjA"`
    Foo     string   `xml:"foo"`
}

type subobjB struct {
    describable
    XMLName xml.Name `xml:"subobjB"`
    Bar     string   `xml:"bar"`
}

type obj struct {
    XMLName xml.Name `xml:"obj"`
    A       subobjA  `xml:"subobjA"`
    B       subobjB  `xml:"subobjB"`
}

func main() {
    sampleXml := `

    outer object
    
        first kind of subobject
        some goop
    
    
        second kind of subobject
        some other goop
    

`

    sampleObj := obj{}
    err := xml.Unmarshal([]byte(sampleXml), &sampleObj)
    if err != nil {
        fmt.Println("Error unmarshalling XML:", err)
        return
    }

    fmt.Println(sampleObj.Description)
    fmt.Println(sampleObj.A.Description)
    fmt.Println(sampleObj.B.Description)
    fmt.Println(sampleObj.A.Foo)
    fmt.Println(sampleObj.B.Bar)
}

在这个示例中,obj 结构体包含 subobjA 和 subobjB 结构体,而这两个结构体又都嵌入了 describable 结构体。通过这种方式,我们可以避免重复定义 Description 字段和 xml:"description" 标签。

总结

通过嵌入带有结构体标签的公共结构体,可以有效地避免在多个结构体中重复定义相同的字段和标签,提高代码的可维护性和可读性。同时,Go 语言的字段提升机制也简化了对嵌入结构体字段的访问,使得代码更加简洁。在处理 XML 数据时,可以考虑使用这种方式来组织结构体,实现代码的 DRY 原则。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

747

2023.08.22

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1881

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2087

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1012

2024.11.28

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

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

196

2025.06.09

golang结构体方法
golang结构体方法

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

189

2025.07.04

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

131

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

54

2026.01.16

热门下载

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

精品课程

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

共32课时 | 3.8万人学习

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

共10课时 | 0.8万人学习

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

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