当前位置: 首页 > 面试题库 >

Golang中的多类型解码器

上官高畅
2023-03-14
问题内容

我有一个XML文档。一些字段具有自定义格式。例:

<document>
  <title>hello world</title>
  <lines>
   line 1
   line 2
   line 3
  </lines>
</document>

我想将其导入如下结构:

type Document struct {
    Title  string   `xml:"title"`
    Lines  []string `xml:"lines"`
}

有什么方法可以实现自定义解码器,它将行字符串拆分成行数组(["line 1", "line 2", "line 3"])?

可以将Lines字段设置为字符串类型,并在xml导入后进行拆分,但这似乎不是一个很好的解决方案。我有什么方法可以定义用于行分割的自定义解码器,并将其与xml解码器组合?


问题答案:

您可以通过定义符合xml.Unmarshaler接口的新类型来实现。因此,与其创建Lines一个[]string,而不是使用适当的UnmarshalXML方法声明一个新类型。例如:

type Lines []string

func (l *Lines) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    var content string
    if err := d.DecodeElement(&content, &start); err != nil {
        return err
    }
    *l = strings.Split(content, "\n")
    return nil
}

您可以在此处看到完整的示例:http :
//play.golang.org/p/3SBu3bOGjR

如果您也想支持这种类型的编码,则可以MarshalXML以类似的方式实现该方法(构造所需的字符串内容并将其传递给编码器)。



 类似资料:
  • 问题内容: 我想创建一个结构,其中一个字段可以举行一些特殊类型的,比如说的数据,和。我想将此结构从JSON解码/编码。我们如何在go / golang中实现这一目标? 例如,我具有以下定义的结构: 哪里是 假设我需要将以下JSON解组到上述struct中: 还有这个: 而且这个还: 我该如何实现? 我可以自己定义并继续实现吗? 还是有一种定义自定义类型的方法,例如说并定义为 然后定义并继续? 我也

  • 问题内容: 当我运行下面的代码片段时,它会引发错误 a.test未定义(类型interface {}是没有方法的接口) 看来类型开关没有生效。 如果我将其更改为 没关系 问题答案: 这是规范(强调我的)定义的正常行为: TypeSwitchGuard可以包含一个简短的变量声明。使用该格式时,将在每个子句中隐式块的开头声明变量。 在大小写正好列出一种类型的子句中,变量具有该类型。 否则,变量具有Ty

  • 问题内容: 当使用as函数参数类型,给定非指针类型并与之一起使用时,我在Go中遇到了一个错误。 因为一段代码值得一千个单词,所以下面是一个示例: 哪个输出: 把我的结构变成一个… 稍后再读一些内容,可以解释其中的一部分,它本身就是一种类型,而不是某种无类型的容器,它解释了,以及无法获取初始类型并返回。的事实。 从文档: 要将JSON解组为接口值,Unmarshal将其中之一存储在接口值中:[…]

  • 本文向大家介绍Golang中的int类型和uint类型到底有多大?,包括了Golang中的int类型和uint类型到底有多大?的使用技巧和注意事项,需要的朋友参考一下 在开始之前,我们先来看看uint 与 int 的区别 上面是图,下面是源码: 引言 今天调试一个问题,发现一个我无法理解的情况: 把64位的数字赋值给uint,我理解uint是32位的,为啥可以编译通过?但是我接着又在 playgr

  • 问题内容: 我必须使用(相对)标准的围棋程序go.net/websocket库。我正在尝试从网页中接收和解码消息,这些消息对于每种消息类型都具有不同的结构,即 有什么方法可以对消息进行“部分”解码,仅在继续将实际消息解码为go结构之前检查该字段? 这是否有必要编写一个自定义a’la ,以将其委托给消息本身的JSON编解码器? 问题答案: 使用json.RawMessage延迟解码,例如 是一个别名

  • 问题内容: 软件包“ gopkg.in/redis.v3”包含一些代码 哪个以以下方式成功工作 问题在于,有时Redis集群会受到重击,有片刻,结果返回的接口为nil。 这是相当容易处理的,但是我希望进行测试以确保它被实际处理并且不会发生类型断言恐慌。 传统上,我会将模拟Redis客户端插入myFunc中,该客户端最终会返回nil。 我面临的问题是编译器无法识别redis.Client满足接口re