Мне нужно написать тесты для функции, в которой возвращаемый результат представляет собой фрагмент больших структур. Это означает, что вам нужно написать тест, в котором «wantResult» должен быть заполнен всеми этими структурами. Самый быстрый способ ее заполнения - вызвать функцию и скопировать / вставить результат в тест. Однако я обнаружил, что нелегко напечатать структуру в подходящем формате, где вы можете просто скопировать / вставить ее.
fmt.Printf("%v",myStruct)
напечатает что-то вроде этого: [{field A field B field C} {field A field B field C}]
т.е. без кавычек для строк, без запятых между полями.
fmt.Printf("%+v",myStruct)
напечатает что-то вроде этого: [{field A:value A field B:value B field C:value C} {field A:value A field B:value B field C:value C}]
- также без кавычек, без запятых между полями.
Наконец, я придумаю решение для отражения, которое выглядит следующим образом:
for _, oneStruct := range gotResult {
s := reflect.ValueOf(&oneStruct).Elem()
typeOfs := s.Type()
fmt.Println("{")
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
switch f.Type().Name() {
case "string":
fmt.Printf("%v:\"%v\",\n", typeOfs.Field(i).Name, f.Interface())
default :
fmt.Printf("%v:%v,\n", typeOfs.Field(i).Name, f.Interface())
}
}
fmt.Println("},")
}
Оно отлично работает для простых плоских структур с типами полей int, float и string. Тем не менее, это выглядит громоздко. Кто-нибудь знает что-нибудь более элегантное для этой цели?