Добавление метода в RootModel как для заголовка, так и для отдельных строк (так что вы можете выбирать диапазон и печатать заголовок только один раз):
type RootModel struct {
A string
B string
C string
D factors
}
type factors struct {
F string
G string
H []int
}
func (*RootModel) CSVheader(w io.Writer) {
cw := csv.NewWriter(w)
cw.Write([]string{"A Key", "B Key", "C Key", "D Key"})
cw.Flush()
}
func (rm *RootModel) CSVrow(w io.Writer) {
cw := csv.NewWriter(w)
cw.Write([]string{rm.A, rm.B, rm.C, rm.D.F})
cw.Write([]string{rm.A, rm.B, rm.C, rm.D.G})
is, _ := json.Marshal(rm.D.H)
cw.Write([]string{rm.A, rm.B, rm.C, string(is)})
cw.Flush()
}
Детская площадка: https://play.golang.org/p/c8UQVQ8tQTX
Вывод:
A Key,B Key,C Key,D Key
SomethingA,SomethingB,SomethingC,SomethingF
SomethingA,SomethingB,SomethingC,SomethingG
SomethingA,SomethingB,SomethingC,"[1,2,3]"
Примечание: если вы имеете дело со срезом RootModel
, вы можете захотеть поместить логику модуля записи CSV на этот уровень - чтобы он мог обрабатыватьодиночный рендер строки заголовка, а затем последующих строк данных.