创建2D切片时出错

时间:2017-11-29 00:37:56

标签: go

我正在尝试在Go中创建并初始化2D切片。虽然以下功能可以正常运行:

func working2D() [][]uint8 {
    p := make([][]uint8, 2)
    for i:=range p{
        p[i]=make([]uint8, 8)
        for j:=range p[i]{
            p[i][j]=uint8(j)
        }
    }
    fmt.Println(p)
    return p
}
  

输出:[[0 1 2 3 4 5 6 7] [0 1 2 3 4 5 6 7]]

但是以下函数甚至不编译并抛出编译错误:

  

sample / main / range.go:35:9:v2声明且未使用

func notWorking2D() [][]uint8 {
    p := make([][]uint8, 1)
    for _,v := range p {
        v = make([]uint8, 8)
        for j, v2 := range v {
            v2 = uint8(j)
        }
    }
    fmt.Println(p)
    return p
}
  

输出:[[],[]]

我在第二个功能中缺少什么?

2 个答案:

答案 0 :(得分:1)

安迪在评论中说:

  

当循环迭代时,范围中的第二个变量将设置为切片中的每个值。分配给该变量不会影响切片。

您可能只想这样做:

func notWorking2D() [][]uint8 {
    p := make([][]uint8, 2)
    for i, _ := range p {      
        p[i] = make([]uint8, 8)
        for j, _ := range p[i] {
            p[i][j] = uint8(j)
        }
    }
    return p
}

https://play.golang.org/p/cHQc9ReJBE

答案 1 :(得分:0)

Go中没有2d切片。

您可以创建“切片”。这有缺点,因为您必须手动初始化每个“子片段”。

还可以为玩具提供更大的灵活性,因为任何特定切片都可以拥有自己的长度和容量。

ActiveModelSerializer