我目前正在努力完成出色的 Tour of Go . 我使用以下解决方案完成了一项练习(#45):
func Pic(dx, dy int) [][]uint8 {
pic := make([][]uint8, dy) /* type declaration */
for i := range pic {
pic[i] = make([]uint8, dx) /* again the type? */
for j := range pic[i] {
pic[i][j] = uint8((i+j)/2)
}
}
return pic
}
我不明白为什么我必须使用 uint8
类型的 make
语句两次(请参阅片段中的注释)。这似乎是多余的,但我无法弄清楚如何以其他方式做到这一点。
最佳答案
为了明确起见,我们可以使用括号将 [][]uint8
重写为 []([]uint8)
:(slices of type >uint8
)。
使用 make内置函数,对于 T
类型的 slice ,make(T, n)
返回一个长度为 的
和容量 T
类型 slice nn
.
因此,make([][]uint8, 2)
等价于make([]([]uint8), 2)
,它返回一个 slice ,长度和容量为 2
,类型为 uint8
的 slice ,其中每个 uint8
类型的 slice 都被初始化为零值(一个 >nil
长度和容量为零的引用)。
多维 slice 是锯齿状的,类似于多维jagged arrays .
例如,
package main
import "fmt"
func main() {
ss := make([][]uint8, 2) // ss is []([]uint8)
fmt.Printf("ss: %T %v %d\n", ss, ss, len(ss))
for i, s := range ss { // s is []uint8
fmt.Printf("ss[%d]: %T %v %d\n", i, s, s, len(s))
}
}
输出:
ss: [][]uint8 [[] []] 2
ss[0]: []uint8 [] 0
ss[1]: []uint8 [] 0
关于types - slice 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7703251/