2016-04-15 2 views
0

Код ниже - это адаптация скрипта Python. Конечно, он не компилируется, и для этого есть несколько причин.Интерфейс литья может отражать типы массивов

Я изо всех сил пытаюсь понять, как это можно исправить, чтобы он дал правильный результат.

В частности:

  1. Я хочу, чтобы представлять либо тип (float64) или array этого типа, так что я по наивности с помощью []interface, но затем передать массив не будет работать. Я понимаю, что могу глубоко скопировать интерфейсный массив с моим массивом, но это единственный способ?

  2. Работа проверки отражения (kinda), но затем я вернусь к литье интерфейса к []interface, и это не сработает.

  3. Простым способом было бы пройти []float, но я также хочу сделать код generic (oops! ;-) достаточно, чтобы принять [][]floats и рекурсивно сходить со сравнений.

Я полностью отключаю?

func assertArrayEquals(first []interface{}, second []interface{}) bool { 
    if len(first) != len(second) { 
     return false 
    } 
    for i := range first { 
     if reflect.ValueOf(first[i]).Kind() == reflect.Array { 
      assertArrayEquals([]interface{}(first[i]), []interface{}(second[i])) 
     } else if second[i] != first[i] { 
      return false 
     } 
    } 
    return true 
} 

func main() { 
    assertArrayEquals([]float64{[]float64{0, 1}, []float64{0, 1}}, []float64{[]float64{0, 1}, []float64{0, 1}}) 
} 

ответ

1

Вот один из способов реализации assertArrayEquals:

func assertArrayEquals(first interface{}, second interface{}) bool { 
    return reflect.DeepEqual(first, second) 
} 

playground example

+0

Спасибо. Я полностью пропустил эту функцию. – Laurent

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