Go 使用[][]int进行边界外切片,但使用map[int][]int进行切片

Go 使用[][]int进行边界外切片,但使用map[int][]int进行切片,go,go-map,Go,Go Map,为什么这个代码可以工作 graph := make(map[int][]int, 0) graph[0] = append(graph[0], 1) 但如果用graph:=make([[]int,0)替换第一行,我会得到panic:runtime错误:索引超出范围?这很奇怪。由于切片长度为0,代码恐慌。如果要向切片添加任何内容,只需提供其长度,如下所示 graph := make([][]int, 1) fmt.Println(len(graph)) graph[0] = append(gr

为什么这个代码可以工作

graph := make(map[int][]int, 0)

graph[0] = append(graph[0], 1)

但如果用
graph:=make([[]int,0)
替换第一行,我会得到
panic:runtime错误:索引超出范围
?这很奇怪。

由于切片长度为
0
,代码恐慌。如果要向切片添加任何内容,只需提供其长度,如下所示

graph := make([][]int, 1)
fmt.Println(len(graph))
graph[0] = append(graph[0], 1)
fmt.Println(graph)
要在第一级将数据追加到切片,请追加到其第一个索引,然后再追加到第二级,如下所示

graph := make([][]int, 0)
fmt.Println(len(graph))
graph = append(graph, []int{1})

检查

由于切片长度为
0
,代码恐慌。如果要向切片添加任何内容,只需提供其长度,如下所示

graph := make([][]int, 1)
fmt.Println(len(graph))
graph[0] = append(graph[0], 1)
fmt.Println(graph)
要在第一级将数据追加到切片,请追加到其第一个索引,然后再追加到第二级,如下所示

graph := make([][]int, 0)
fmt.Println(len(graph))
graph = append(graph, []int{1})

Check

让我们简化您的代码,以便更清楚地了解正在发生的事情():

从这一点我们可以看出,这种差异是由于
map[int]
[]int
之间的差异造成的——类型中的第二个数组实际上是不相关的

现在要理解为什么会发生这种情况,我们需要了解Go如何处理映射和切片访问。从中我们了解到:

如果请求的键不存在,我们将获得值类型的零值

在原始代码中,切片(
[]int
)的零值是
nil
,而
append()
nil
作为第一个参数作为空切片处理

graph := make(map[int][]int)

graph[4] = append(graph[4], 1)
graph[7] = append([]int{}, 1, 2)
graph[11] = append([]int{1, 2, 3}, 4, 5)
但是当我们试图访问空切片的第0个元素时,我们会感到恐慌,因为切片是空的


总之,
append
和你的类型的第二部分都是你问题中的红鲱鱼。当试图访问切片第一维中不存在的元素时,会发生恐慌。

让我们简化代码,使其更清楚地显示发生了什么():

从这一点我们可以看出,这种差异是由于
map[int]
[]int
之间的差异造成的——类型中的第二个数组实际上是不相关的

现在要理解为什么会发生这种情况,我们需要了解Go如何处理映射和切片访问。从中我们了解到:

如果请求的键不存在,我们将获得值类型的零值

在原始代码中,切片(
[]int
)的零值是
nil
,而
append()
nil
作为第一个参数作为空切片处理

graph := make(map[int][]int)

graph[4] = append(graph[4], 1)
graph[7] = append([]int{}, 1, 2)
graph[11] = append([]int{1, 2, 3}, 4, 5)
但是当我们试图访问空切片的第0个元素时,我们会感到恐慌,因为切片是空的

总之,
append
和你的类型的第二部分都是你问题中的红鲱鱼。当尝试访问切片第一维度中不存在的元素时,会发生恐慌。

make(map[int][]int,0)
创建
[]int
映射

通过Go中的设计,您可以从地图中获取任何元素。如果它不存在,你会收到“零”值,这是一个空的片段

graph := make(map[int][]int)

graph[4] = append(graph[4], 1)
graph[7] = append([]int{}, 1, 2)
graph[11] = append([]int{1, 2, 3}, 4, 5)
打印它将生成此切片:

fmt.Printf("%#v\n", graph)

map[int][]int{
    4:[]int{1},
    7:[]int{1, 2},
    11:[]int{1, 2, 3, 4, 5},
}
第二个示例创建一个
[]int
片的空片。切片的工作方式与映射不同,因此为不存在的元素编制索引会让您感到恐慌。

make(map[int][]int,0)
创建一个
映射
[]int

通过Go中的设计,您可以从地图中获取任何元素。如果它不存在,你会收到“零”值,这是一个空的片段

graph := make(map[int][]int)

graph[4] = append(graph[4], 1)
graph[7] = append([]int{}, 1, 2)
graph[11] = append([]int{1, 2, 3}, 4, 5)
打印它将生成此切片:

fmt.Printf("%#v\n", graph)

map[int][]int{
    4:[]int{1},
    7:[]int{1, 2},
    11:[]int{1, 2, 3, 4, 5},
}

第二个示例创建一个
[]int
片的空片。切片的工作方式与映射不同,因此索引不存在的元素会让您感到恐慌。

当您在
graph:=make(map[int][]int,0)
中创建时,您将内存分配给映射,而不是数组。所以你只能这样做
graph:=make(映射[int][]int)

解压缩您的代码:

type a []int
type m map[int]a

func main() {
    fmt.Println("Hello, playground")

    //decomping graph := make(map[int][]int, 0)
    graph := make(m)

    //map is empty
    fmt.Println(len(graph))

    //decomping graph[0] := append(graph[0], 1)
    itm_a := 1
    arr_a := []int{}

    //appeding item to "a" type
    arr_a = append(arr_a, itm_a)

    //appending array of a to graph
    graph[0] = arr_a

    //print graph
    fmt.Println(graph)
}
再见

您得到的错误是由概念错误引起的。 当您执行
graph:=make([]]int,0)
时,您是在将内存分配给片的片,而不是数组。再见

因此,您可以执行以下操作(反编译解决方案):


请参见中的当您在
图形中创建时:=make(map[int][]int,0)
,您将内存分配给映射,而不是数组。所以你只能这样做
graph:=make(映射[int][]int)

解压缩您的代码:

type a []int
type m map[int]a

func main() {
    fmt.Println("Hello, playground")

    //decomping graph := make(map[int][]int, 0)
    graph := make(m)

    //map is empty
    fmt.Println(len(graph))

    //decomping graph[0] := append(graph[0], 1)
    itm_a := 1
    arr_a := []int{}

    //appeding item to "a" type
    arr_a = append(arr_a, itm_a)

    //appending array of a to graph
    graph[0] = arr_a

    //print graph
    fmt.Println(graph)
}
再见

您得到的错误是由概念错误引起的。 当您执行
graph:=make([]]int,0)
时,您是在将内存分配给片的片,而不是数组。再见

因此,您可以执行以下操作(反编译解决方案):


请参见中的,因为切片的长度为0,因此无法附加到it@Himanshu追加的目的不是动态更改切片的大小吗?我尝试了graph:=[][]int{},但这也不起作用。是的,它起作用了,但您必须先设置它的键,因为它是二维切片,这就是错误的原因。因为切片的长度是0,所以您无法追加到it@Himanshu追加的目的不是动态更改切片的大小吗?我尝试了graph:=[][]int{},但这也不起作用。是的,它起作用了,但您必须先设置它的键,因为它是二维切片,这就是错误的原因。