博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go中map与xml互转
阅读量:4179 次
发布时间:2019-05-26

本文共 1453 字,大约阅读时间需要 4 分钟。

go中map与xml不能直接互转,需要自定义map类型并重写MarshalXML()和UnmarshalXML()方法。

stringmap.go

package stringmapimport (    "encoding/xml"    "io")type StringMap map[string]stringtype xmlMapEntry struct {    XMLName xml.Name    Value   string `xml:",chardata"`}func (m StringMap) MarshalXML(e *xml.Encoder, start xml.StartElement) error {    if len(m) == 0 {        return nil    }    err := e.EncodeToken(start)    if err != nil {        return err    }    for k, v := range m {        e.Encode(xmlMapEntry{XMLName: xml.Name{Local: k}, Value: v})    }    return e.EncodeToken(start.End())}func (m *StringMap) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {    *m = StringMap{}    for {        var e xmlMapEntry        err := d.Decode(&e)        if err == io.EOF {            break        } else if err != nil {            return err        }        (*m)[e.XMLName.Local] = e.Value    }    return nil}

stringmap_test.go

package stringmapimport (    "testing"    "encoding/xml"    "fmt")func TestName(t *testing.T) {    userMap := make(map[string]string)    userMap["name"] = "Name"    userMap["id"] = "1"    buf, _ := xml.Marshal(StringMap(userMap))    fmt.Println(string(buf))    stringMap := make(map[string]string)    err := xml.Unmarshal(buf, (*StringMap)(&stringMap))    if err != nil {        fmt.Println(err)    }    fmt.Println(stringMap)}

输出:

Name
1
map[name:Name id:1]

欢迎关注我的公众号“彤哥读源码”,查看更多“源码&架构&算法”系列文章, 与彤哥一起畅游源码的海洋。

qrcode

转载地址:http://oseai.baihongyu.com/

你可能感兴趣的文章
What is hosts?
查看>>
一张图读懂互联网大咖
查看>>
grep命令+正则表达式
查看>>
here文档
查看>>
linux 两个装逼的命令
查看>>
C语言中的static
查看>>
open系统调用
查看>>
man 命令
查看>>
linux 特权级 用户态 内核态
查看>>
【C++】入门基础概念
查看>>
【C++】面向对象程序设计
查看>>
【C++】类与对象
查看>>
【C++】类和对象二
查看>>
【C++】构造函数&&析构函数
查看>>
【C++】继承语法&&继承方式
查看>>
【C++】继承时的名字遮蔽&&派生类的构造函数
查看>>
【C++】智能指针的设计与实现
查看>>
栈的简介与C++模板实现
查看>>
队列的简介与C++模板实现
查看>>
哈夫曼树与哈夫曼编码详解及C++模板实现
查看>>