Вложенные циклы
В Go циклы можно вкладывать друг в друга, как и в других языках программирования. Вложенность — это размещение одного конструкта внутри другого. В данном случае вложенный цикл — это цикл, который работает внутри другого цикла. Это может быть полезно, когда вы хотите выполнять цикличное действие для каждого элемента набора данных.
Вложенные циклы структурно похожи на вложенные операторы if. Они построены следующим образом:
for {
[Action]
for {
[Action]
}
}
Программа сначала начинает выполнять внешний цикл, запуская первую итерацию. Эта первая итерация запускает внутренний цикл, который выполняется до конца. После этого программа возвращается вверх внешнего цикла, завершая вторую итерацию и снова запуская внутренний цикл. Опять же, внутренний цикл выполняется до конца, а программа будет возвращаться вверх внешнего цикла, пока последовательность не будет завершена или оператор break или другой оператор прервет процесс.
Давайте реализуем вложенный цикл for, чтобы мы более внимательно изучили этот вопрос. В данном примере внешний цикл будет проходить по срезу с целыми числами numList, а внутренний цикл будет проходить по срезу строк alphaList.
main.go
package main
import "fmt"
func main() {
numList := []int{1, 2, 3}
alphaList := []string{"a", "b", "c"}
for _, i := range numList {
fmt.Println(i)
for _, letter := range alphaList {
fmt.Println(letter)
}
}
}
Copy
При запуске этой программы мы получим следующий вывод:
Output 1 a b c 2 a b c 3 a b c
Вывод показывает, что программа завершает первую итерацию внешнего цикла, выводя 1, после чего запускается выполнение внутреннего цикла с выводом a, b и c соответственно. Когда внутренний цикл завершен, программа возвращается вверх внешнего цикла, выводит 2, а затем снова в полном объеме выводит внутренний цикл (a, b, c) и т. д.
Вложенные циклы for могут быть полезными для итерации по элементам внутри срезов, состоящих из срезов. В срезе, состоящем из срезов, если мы используем только один цикл for, программа выведет каждый внутренний список как элемент:
main.go
package main
import "fmt"
func main() {
ints := [][]int{
[]int{0, 1, 2},
[]int{-1, -2, -3},
[]int{9, 8, 7},
}
for _, i := range ints {
fmt.Println(i)
}
}
Copy
Output [0 1 2] [-1 -2 -3] [9 8 7]
Чтобы получить доступ к каждому элементу внутренних срезов, мы реализовали вложенный цикл for:
main.go
package main
import "fmt"
func main() {
ints := [][]int{
[]int{0, 1, 2},
[]int{-1, -2, -3},
[]int{9, 8, 7},
}
for _, i := range ints {
for _, j := range i {
fmt.Println(j)
}
}
}
Copy
Output 0 1 2 -1 -2 -3 9 8 7
Когда мы используем вложенный цикл for, мы можем пройтись по отдельным позициям внутри этих срезов.