问题更多的是“可以去做吗?”然后解决实际问题。
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/