我正在通过优秀的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
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我必须使用两次类型的make语句uint8(请参阅代码段中的注释).这似乎是多余的,但我无法弄清楚如何以另一种方式做到这一点.
pet*_*rSO 34
为了明确,我们可以使用括号重写[][]uint8为[]([]uint8):一片(类型的切片uint8).
使用make内置函数,对于切片类型T,make(T, n)返回T具有长度n和容量的切片类型n.
因此,make([][]uint8, 2)等效于make([]([]uint8), 2)它返回具有类型的切片的长度和容量的2切片uint8,其中每个切片类型uint8被初始化为其零值(nil具有长度和容量为零的参考).
多维切片是锯齿状的并且类似于多维锯齿状阵列.
例如,
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))
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
ss: [][]uint8 [[] []] 2
ss[0]: []uint8 [] 0
ss[1]: []uint8 [] 0
Run Code Online (Sandbox Code Playgroud)
jim*_*imt 33
在Go中没有其他方法可以做到这一点.
是的,我同意它是冗长的,但是必要的.第二个make()语句完全独立于第一个.可以说,编译器应该能够从中推断出类型pic[i],但此时并不是这样.
另一点:如果在第二种情况下省略了类型,make()语句将如何显示?make()仍然需要进行实际分配,并能够指定所需的len/capacity.
作为旁注,您混合了切片长度.练习声明顶级切片应该具有长度dy,而不是dx您放入代码中.
| 归档时间: |
|
| 查看次数: |
28770 次 |
| 最近记录: |