go - 编码 xml 字段时如何使用结构标签?

标签 go

问题更多的是“可以去做吗?”然后解决实际问题。

package main

import (
    "encoding/xml"
    "fmt"
    "log"
)

type Example struct {
    Float  Float
    Float3 Float `printf:"%.3f"`
    Float7 Float `printf:"%.7f"`
}

type Float float64

func main() {
    e := Example{
        Float:  1.0,
        Float3: 2.0,
        Float7: 3.0,
    }

    b, err := xml.MarshalIndent(e, "", "  ")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(string(b))
}

https://play.golang.org/p/Dq9M9UvwS4Q

以上示例输出:

<Example>
  <Float>1</Float>
  <Float3>2</Float3>
  <Float7>3</Float7>
</Example>

但我希望它是:

<Example>
  <Float>1</Float>
  <Float3>2.000</Float3>
  <Float7>3.0000000</Float7>
</Example>

所以我想使用struct 标签来影响这些字段的xml 输出格式。我不认为我相信我可以在 Float 类型上使用 MarshalXML 方法,因为那时我无权访问 struct 标记。我可以为示例类型创建一个 MarshalXML,但这意味着要从 encoding/xml/marshal.go 复制大量编码逻辑。有没有办法在编码特定字段时使用结构标签?

最佳答案

Is there a way to use struct tags when marshalling a specific field?

没有。并且有充分的理由。编码和解码是一对一的转换。如果可以进行任意格式设置,您就失去了这种保证。

如果您需要一种数据类型,其行为类似于具有三位小数精度的 float ,您应该将其设为独特的数据类型,而不是依赖于通用浮点类型的任意、有损格式。

现在,当然,您可以编写自己的库来支持任意结构标记,并且可以获得此功能。虽然这在某些情况下可能有意义,但对于 XML(或任何其他定义的数据传输格式)的编码(marshal)处理,出于上述原因,我强烈反对这样做。

关于go - 编码 xml 字段时如何使用结构标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57606324/

相关文章:

arrays - 获取嵌套数组中具有特定ObjectId的数组对象

go - 在 Golang 中错误下划线,无需解释

Golang 映射结构映射

mongodb - 使用嵌套结构的逻辑运算符查找查询?

string - 如何将通配符 * 集成到数学验证路由中

go - 我应该如何构建一个 Go 模块以便能够轻松运行它并导入内部包?

function - 如何从 Go/Golang 中的另一个方法表达式访问方法表达式(结构函数)?

go - 为什么 fmt.Printf() 会在内存地址等其他包中记录 `const`?

go - goroutine的执行时间点是什么?

go - gRPC 连接问题 : How to figure out if it is the server or the client?