出于日志记录的目的,我希望能够快速将任何类型的切片(无论是整数,字符串还是自定义结构)写入Go中的文件。例如,在C#中,我可以在一行中执行以下操作:
File.WriteAllLines(filePath, myCustomTypeList.Select(x => x.ToString());
我怎样才能在Go中这样做?结构体实现了Stringer
接口。
编辑:我特别想要将输出打印到文件中,并且切片中每个项目一行
答案 0 :(得分:2)
将fmt包格式值用作字符串并打印到文件:
func printLines(filePath string, values []interface{}) error {
f, err := os.Create(filePath)
if err != nil {
return err
}
defer f.Close()
for _, value := range values {
fmt.Fprintln(f, value) // print values to f, one per line
}
return nil
}
fmt.Fprintln
会在您的结构类型上调用Stringer()
。它还会打印int
值和string
值。
使用反射包编写任何切片类型:
func printLines(filePath string, values interface{}) error {
f, err := os.Create(filePath)
if err != nil {
return err
}
defer f.Close()
rv := reflect.ValueOf(values)
if rv.Kind() != reflect.Slice {
return errors.New("Not a slice")
}
for i := 0; i < rv.Len(); i++ {
fmt.Fprintln(f, rv.Index(i).Interface())
}
return nil
}
如果您的变种values
类型为myCustomList
,那么您可以这样调用它:err := printLines(filePath, values)