Короткий ответ: go не предназначен для такого рода проблем. То, что вы хотите, эквивалентно функции zip
, которая присутствует на некоторых языках (например, Haskell, Python, ...)
Однако в Голанге у вас будет одна большая проблема: у вас не может быть динамического типы. То есть: массив может содержать только один тип (int OR bool), а не несколько. Обходной путь заключается в создании массива интерфейса, но это означает, что вам придется делать уродливые утверждения типа, чтобы вернуть правильный тип.
Кроме того, у вас есть общий способ сделать это, но тип, который вы получите в конце, будет [][]interface{}
и не будет знать, что внутри.
Для примера: здесь это самый простой способ сделать то, что вы хотите (не вообще):
func main() {
a := [3]int{2, 3, 5}
b := [2]bool{true, false}
var c [6][2]interface{}
i := 0
for _, val1 := range a {
for _, val2 := range b {
c[i] = [2]interface{}{val1, val2}
i += 1
}
}
var a1 int = c[0][0].(int)
var b1 bool = c[0][1].(bool)
fmt.Printf("c[0] is %v, a1 is %d and b1 is %v\n", c[0], a1, b1)
fmt.Println(c)
}
Как вы можете видеть, что это некрасиво и бесполезно на практике (и очень подвержены ошибкам)
Итак, если вы хотите сделать такие преобразования, вы должны использовать другой язык, Go не был (и не будет) предназначен для таких целей.
Большое спасибо @ t-claverie за ваш ответ. Ваш код-пример - это именно то, что я имел в виду под «множественными петлями для диапазона» ... но дело в том, что может быть еще больше массивов, которые должны быть повторены ... Вы сказали, что самая большая проблема это «два типа в одном массиве» -проблема ... как насчет решения этой части моей проблемы, заменив массив «c» на функцию «c», которая имеет такое же понимание типа: 'func c (a int , b bool) '? –
@uzed_creative Если у вас есть тип и количество ваших массивов, это возможно. Если вы этого не сделаете, вам нужно создать пользовательские функции с помощью типа func f (args interface {} ...) ', который будет выполнять те же утверждения типа, что и выше. –