types - slice 类型

标签 types go slice

我目前正在努力完成出色的 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 n 和容量 n.

因此,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/

相关文章:

mysql - 如何使用 chmod 作为 mysql 数据类型

google-app-engine - 使用 App Engine 开发服务器向 Google API 声明身份

javascript - 使用字符串切片在页面加载时显示值

python - 在 [ :index] 上使用动态索引列出切片

go - Go 中的可变泛型参数

arrays - 如何将 []string 转换为 ...string

c++ - 从 Type* 转换为 Type,反之亦然

java - 什么里面有什么?框架、 Pane 、按钮、标签、容器等

go - 如何在没有泛型的情况下对这种复合类型层次结构进行建模

Golang并发死锁