我得到了这个代码:
package main
import (
"fmt"
"gopkg.in/yaml.v2"
)
func main() {
kkk := "common:\n vartest1: 1.2000\n vartest2: 1.22233"
tmp := map[string]interface{}{}
yaml.Unmarshal([]byte(kkk), tmp)
fmt.Println(tmp)
}
我所期望的是浮点数的精度与字符串保持一致。但我得到了以下输出:
map[common:map[vartest1:1.2 vartest2:1.22233]]
我试过这个:
package main
import (
"fmt"
"gopkg.in/yaml.v2"
)
type Myfloat64 float64
func (e *Myfloat64) UnmarshalYAML(unmarshal func(interface{}) error) error {
var test Myfloat64
err := unmarshal(&test)
if err != nil {
return err
}
fmt.Println(test)
*e = test
return nil
}
func main() {
kkk := "common:\n vartest1: 1.2000\n vartest2: 1.22233"
tmp := map[string]interface{}{}
yaml.Unmarshal([]byte(kkk), tmp)
fmt.Println(tmp)
}
但是UnmarshalYAML
还没有被调用,因为类型Myfloat64不在map[string]interface{}{}
中。我必须确保map[string]interface{}{}
不变,因为我不能有一个固定的结构来定义未封送的结构。
是否有办法保持精度?输入必须是“common:\n vartest1:1.2000\n变量测试2:1.22233”。不允许将1.2000更新为字符串。
1条答案
按热度按时间kyxcudwk1#
有没有办法保持精度?
不要将字符串解析为float,而是保留原始值,即保留
string
。下面是一个例子:
yaml.v3
在playground上试试。