Вот ваши данные:
var m = [][]int{
[]int{0, 1, 2, 3},
[]int{4, 5, 6, 7},
[]int{8, 9, 10, 11},
[]int{12, 13, 14, 15},
}
Сначала вы спрашиваете, что внутри: = m [1: 3] [1: 3]?
Ну, принимая по одному за раз, m [1: 3] - это подлисс, который вы получаете, когда получаете элементы с 1 по 3, не включая 3. Таким образом, это элементы 1 и 2. Элемент 0 - это [] int {0, 1, 2, 3}, элемент 1 - [] int {4, 5, 6, 7}, а элемент 2 равен [] int {8, 9, 10, 11},
Так что m [1: 3] равно
[][]int{
[]int{4, 5, 6, 7},
[]int{8, 9, 10, 11},
}
Теперь, чтобы получить m [1: 3] [1: 3], мы повторим то же самое для этого результата.Однако на этот раз есть только два элемента.Мы снова хотим элементы 1 и 2. Мы пропускаем элемент 0, который является [] int {4, 5, 6, 7}.Элементом 1 является [] int {8, 9, 10, 11}.Элемент 2 отсутствует. Однако результатом m [1: 3] был сублис, а нижележащий срез имел дополнительный элемент.Таким образом, расширив этот подлис, мы можем вернуть этот элемент обратно, а это скрытый элемент 2, который является [] int {12, 13, 14, 15}.Итак, m [1: 3] [1: 3] равно
[][]int{
[]int{8, 9, 10, 11},
[[]int{12, 13, 14, 15},
}
Наконец, вам интересно, почему func innerMatrix работает по-другому?Он начинается с получения m [1: 3], которое равно
[][]int{
[]int{4, 5, 6, 7},
[]int{8, 9, 10, 11},
}
Тогда код НЕ принимает другой подслим так же, как m [1: 3] [1: 3] равно двумпоследовательные сублицензии.Вместо этого вы берете каждый элемент в срез и извлекаете подлис из каждого элемента. Первый раз, когда вы берете субликсы [1: 3] из [] int {4, 5, 6, 7}.В результате получается
[]int{5, 6}
Второй раз, когда вы делаете то же самое для второго элемента [] int {8, 9, 10, 11}, который равен
[]int{9, 10}
Наконецкаждый раз, когда вы добавляете результат к результирующему срезу, вы добавляете [] int {5, 6} к [], чтобы получить [] [] {int {5, 6}}, а затем добавляете [] int{9, 10}, чтобы дать
[][]{int{5, 6}, []int{9, 10} }