Go 读取YAML文件并映射到结构的切片
我正在尝试使用GO读取YAML文件,并将其映射到我定义的结构: 我过去常常读入文件,解组数据,然后打印一些数据Go 读取YAML文件并映射到结构的切片,go,yaml,Go,Yaml,我正在尝试使用GO读取YAML文件,并将其映射到我定义的结构: 我过去常常读入文件,解组数据,然后打印一些数据 package main import ( "fmt" "gopkg.in/yaml.v2" "io/ioutil" "log" "time" ) type Date_File struct { Owner string `yaml:"owner"` Init time.Time `yaml:"in
package main
import (
"fmt"
"gopkg.in/yaml.v2"
"io/ioutil"
"log"
"time"
)
type Date_File struct {
Owner string `yaml:"owner"`
Init time.Time `yaml:"initialized"`
TimeData []Time_Data `yaml:"time_data"`
}
type Time_Data struct {
//
Action string `yaml:"action"`
Time time.Time `yaml:"time"`
}
func checkerr(err error) {
if err != nil {
log.Fatal(err)
}
}
func read() (td *Date_File) {
//td := &Date_File{}
gtt_config, err := ioutil.ReadFile("go_time_tracker.yml")
checkerr(err)
err = yaml.Unmarshal(gtt_config, &td)
return td
}
func main() {
//
time_data := read()
fmt.Println(time_data)
fmt.Println(time_data.TimeData[0])
fmt.Println(time_data.Owner)
}
当我运行它时,第一个fmt.Println(time\u data)
工作,显示引用及其数据。但是,下一行没有指出索引超出范围:
然后我想可能我的YAML格式不正确,所以我将YAML文件加载到Ruby的IRB中,然后
IRB输出显示我的YAML格式正确,但是,我认为我没有正确地将其解组。然而,我不确定我需要做些什么才能让它发挥作用。我确信我没有考虑如何正确地做到这一点,因为Ruby隐藏了很多 首先,在后面添加
checkerr(err)
err = yaml.Unmarshal(gtt_config, &td)
您将得到相应的错误,即时间解析错误
。yaml
解码器期望时间格式。有几种方法可以解决此问题:
“2012-10-31T15:50:13.793654Z”
yaml.Unmarshaler
接口,或time.time
包装为自定义类型,然后实现encoding.TextUnmarshaler
接口Date\u文件
和Time\u数据
类型实现自定义解组器。将以下内容添加到源代码中
func (df *Date_File) UnmarshalYAML(unmarshal func(interface{}) error) error {
//Unmarshal time to string then convert to time.Time manually
var tmp struct {
Owner string `yaml:"owner"`
Init string `yaml:"initialized"`
TimeData []Time_Data `yaml:"time_data"`
}
if err := unmarshal(&tmp); err != nil {
return err;
}
const layout = "2006-01-02 15:04:05.999999999 -0700 MST"
tm, err := time.Parse(layout, tmp.Init)
if err != nil {
return err
}
df.Owner = tmp.Owner
df.Init = tm
df.TimeData = tmp.TimeData
return nil
}
func (td *Time_Data) UnmarshalYAML(unmarshal func(interface{}) error) error {
//Unmarshal time to string then convert to time.Time manually
var tmp struct {
Action string `yaml:"action"`
Time string `yaml:"time"`
}
if err := unmarshal(&tmp); err != nil {
return err;
}
const layout = "2006-01-02 15:04:05.999999999 -0700 MST"
tm, err := time.Parse(layout, tmp.Time)
if err != nil {
return err
}
td.Action = tmp.Action
td.Time = tm
return nil
}
如果您有许多类型
具有time.time
字段,则解决方案(1)可能不切实际
解决方案(2):如果您查看的源代码,它依靠textumarshaler
将字符串转换为相应的类型。在这里,您需要:
CustomTime
)time.time
字段替换为CustomTime
UnmarshalText
首先,在后面添加
checkerr(err)
err = yaml.Unmarshal(gtt_config, &td)
您将得到相应的错误,即时间解析错误
。yaml
解码器期望时间格式。有几种方法可以解决此问题:
“2012-10-31T15:50:13.793654Z”
yaml.Unmarshaler
接口,或time.time
包装为自定义类型,然后实现encoding.TextUnmarshaler
接口Date\u文件
和Time\u数据
类型实现自定义解组器。将以下内容添加到源代码中
func (df *Date_File) UnmarshalYAML(unmarshal func(interface{}) error) error {
//Unmarshal time to string then convert to time.Time manually
var tmp struct {
Owner string `yaml:"owner"`
Init string `yaml:"initialized"`
TimeData []Time_Data `yaml:"time_data"`
}
if err := unmarshal(&tmp); err != nil {
return err;
}
const layout = "2006-01-02 15:04:05.999999999 -0700 MST"
tm, err := time.Parse(layout, tmp.Init)
if err != nil {
return err
}
df.Owner = tmp.Owner
df.Init = tm
df.TimeData = tmp.TimeData
return nil
}
func (td *Time_Data) UnmarshalYAML(unmarshal func(interface{}) error) error {
//Unmarshal time to string then convert to time.Time manually
var tmp struct {
Action string `yaml:"action"`
Time string `yaml:"time"`
}
if err := unmarshal(&tmp); err != nil {
return err;
}
const layout = "2006-01-02 15:04:05.999999999 -0700 MST"
tm, err := time.Parse(layout, tmp.Time)
if err != nil {
return err
}
td.Action = tmp.Action
td.Time = tm
return nil
}
如果您有许多类型
具有time.time
字段,则解决方案(1)可能不切实际
解决方案(2):如果您查看的源代码,它依靠textumarshaler
将字符串转换为相应的类型。在这里,您需要:
CustomTime
)time.time
字段替换为CustomTime
UnmarshalText
我不敢相信改变我的时间格式是阻止我把它投入工作的原因。非常感谢。我不知道RFC3339文件。谢谢你,普蒂真不敢相信改变我的时间格式是阻止我把它投入工作的原因。非常感谢。我不知道RFC3339文件。谢谢你,普图回答几乎解决了我的问题。几乎,普图回答解决了我的问题。
func (df *Date_File) UnmarshalYAML(unmarshal func(interface{}) error) error {
//Unmarshal time to string then convert to time.Time manually
var tmp struct {
Owner string `yaml:"owner"`
Init string `yaml:"initialized"`
TimeData []Time_Data `yaml:"time_data"`
}
if err := unmarshal(&tmp); err != nil {
return err;
}
const layout = "2006-01-02 15:04:05.999999999 -0700 MST"
tm, err := time.Parse(layout, tmp.Init)
if err != nil {
return err
}
df.Owner = tmp.Owner
df.Init = tm
df.TimeData = tmp.TimeData
return nil
}
func (td *Time_Data) UnmarshalYAML(unmarshal func(interface{}) error) error {
//Unmarshal time to string then convert to time.Time manually
var tmp struct {
Action string `yaml:"action"`
Time string `yaml:"time"`
}
if err := unmarshal(&tmp); err != nil {
return err;
}
const layout = "2006-01-02 15:04:05.999999999 -0700 MST"
tm, err := time.Parse(layout, tmp.Time)
if err != nil {
return err
}
td.Action = tmp.Action
td.Time = tm
return nil
}
type CustomTime struct {
time.Time
}
func (tm *CustomTime) UnmarshalText(text []byte) error {
const layout = "2006-01-02 15:04:05.999999999 -0700 MST"
tmValue, err := time.Parse(layout, string(text))
if err != nil {
return err
}
tm.Time = tmValue
return nil
}
//Not directly related, for print function etc.
func (tm CustomTime) String() string {
return tm.Time.String()
}