我目前正在努力通过优秀的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语句(参见代码片段中的注释).这似乎是多余的,但我想不出用其他方法做这件事.

推荐答案

在围棋中没有其他方法可以做到这一点.

是的,我同意这是冗长的,但很有必要.第二个make()语句完全独立于第一个语句.有人可能会争辩说,编译器应该能够从pic[i]推断出类型,但在这一点上它不能.

另一点是:如果在第二种情况下省略了类型,make()语句会是什么样子?仍然需要make()来执行实际分配并能够指定所需的长度/容量.

顺便说一句,你把切片长度弄混了.本练习说明顶级切片的长度应该是dy,而不是您在代码中放入的dx.

Go相关问答推荐

GoLang Mochi MQTT服务器(带Python Paho MQTT客户端SSL身份验证失败

验证访问令牌(密钥罩)

GORM Find方法中缺少字段

如何在围棋中从多部分.Part中获取多部分.文件而不保存到磁盘?

Go中的Slice[:1][0]与Slice[0]

理解Golang中的IOTA和常量

无法获取RPC描述符

如何使用 AWS sdk 在 Go 中正确解组 PartiQL 查询的结果?

如何模拟 stripe 需要 webhooks 的捕获事件?

Opensearch 错误 ping 弹性服务器:由未知权威签署的 x509 证书

缺少签名帮助文档

有没有办法约束(通用)类型参数?

io.Pipe 使用困难

同时调用应该只获取一次数据

如何使用golang操作很长的字符串以避免内存不足

带有 grpc 的 protobuf 用于拆分包中的 Go

为什么 Go 中的 maps.Keys() 将 map 类型指定为 M?

如何在 Gorm 中获得特定日期的最大值?

gopls 为 github.com/Shopify/sarama 返回错误gopls: no packages returned: packages.Load error

如何访问Go 1.18泛型 struct (structs)中的共享字段