2015-08-12 4 views
4

Мне было интересно, существует ли общий способ модуляции тестирования значений довольно большой структуры без необходимости писать много операторов if друг под другом. Я знаю, что в Go мы можем использовать модульные тесты на основе таблиц, но я еще не нашел, как мы можем реализовать этот подход, основанный на таблицах, с помощью структур.Сравнение нескольких структурных полей в Go

Моя цель - создать структуру, сделать что-то с ней и выполнить единицу измерения новых значений структуры. Кто-нибудь знает, как я могу достичь этого с помощью табличных тестов или если есть лучший способ сделать это?

+0

Вы хотите проверить поля * все * или только некоторые из них? –

+0

Все поля, если только нужно проверить некоторые из них, я могу просто сделать их с помощью нескольких утверждений if, но для всех из них он просто не похож на хорошую практику. – jensbrulmans

ответ

2

Если вам необходимо проверить все поля, достаточно сравнить структуры:

type S struct { 
    A int 
    B float64 
} 

func main() { 
    fmt.Println(S{1, 3.14} == S{1, 3.14}) // Prints true. 
} 

Обратите внимание, однако, что если ваша содержат указатели Структуры, которые могут получить сложны, потому что они могут указывать на два разных, но равные значения. В этом случае, вы можете использовать reflect.DeepEqual:

type S2 struct { 
    A int 
    B *float64 
} 

func main() { 
    var f1, f2 = 3.14, 3.14 
    // Prints false because the pointers differ. 
    fmt.Println(S2{1, &f1} == S2{1, &f2}) 
    // Prints true. 
    fmt.Println(reflect.DeepEqual(S2{1, &f1}, S2{1, &f2})) 
} 

Экспозиция: http://play.golang.org/p/G24DbRDQE8.

Все, что лучше, чем это, скорее всего, потребует от вас определения ваших собственных методов равенства.

+0

Спасибо, особенно за 'reflect.DeepEqual'. Я думаю, что буду знать, как управлять этим сейчас, потому что я немного беспокоился о своих указателях. ура – jensbrulmans

Смежные вопросы