繁体   English   中英

切片类型

[英]Slice of slices types

我正在通过优秀的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) :一片(类型为uint8切片)。

使用make内置函数,对于T类型的切片, make(T, n)返回长度为n且容量为n T类切片。

因此, 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))
    }
}

输出:

ss:    [][]uint8 [[] []] 2
ss[0]: []uint8 [] 0
ss[1]: []uint8 [] 0

在Go中没有其他方法可以做到这一点。

是的,我同意它是冗长的,但是必要的。 第二个make()语句完全独立于第一个。 可以认为编译器应该能够从pic[i]推断出类型,但此时并不是这样。

另一点:如果在第二种情况下省略了类型,make()语句将如何显示? make()仍然需要进行实际分配,并能够指定所需的len / capacity。

作为旁注,您混合了切片长度。 练习声明顶级切片应该具有长度dy ,而不是您放入代码中的dx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM