我正在尝试在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
}
输出:[[],[]]
我在第二个功能中缺少什么?
答案 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
}
答案 1 :(得分:0)
Go中没有2d切片。
您可以创建“切片”。这有缺点,因为您必须手动初始化每个“子片段”。
还可以为玩具提供更大的灵活性,因为任何特定切片都可以拥有自己的长度和容量。
ActiveModelSerializer