golang slice index out of range错误

来源:互联网 发布:淘宝主图背景图片大全 编辑:程序博客网 时间:2024/06/06 20:11

直接上代码

var group []string    group[0]="abc"    fmt.Println(group[0])

编译正常,运行报错如下

panic: runtime error: index out of rangegoroutine 1 [running]:panic(0x47a880, 0xc42000a110)    /opt/tools/go1.7.3/src/runtime/panic.go:500 +0x1a1main.main()    /opt/IdeaProjects/test-embeded-struct/main.go:11 +0x14exit status 2

index越界,于是改了一下代码

    var group []string    fmt.Println(len(group))    fmt.Println(cap(group))    group[0]="abc"    fmt.Println(group[0])

输出如下

00panic: runtime error: index out of rangegoroutine 1 [running]:panic(0x48fec0, 0xc42000a110)    /opt/tools/go1.7.3/src/runtime/panic.go:500 +0x1a1main.main()    /opt/IdeaProjects/test-embeded-struct/main.go:13 +0x10aexit status 2

也就是说,slice声明的时候如果不同时初始化数据,默认长度和容量都是0,下标0意味着长度是1,所以index越界了。


那么,使用slice的时候有下面几种方式


第一,声明的时候初始化数据,例如

test:=[]string{"a","b","c"}

第二,从已经初始化数据的slice‘切’出来

test:=[]string{"a","b","c"}your_string=test[0:1]

第三,append方法,会默认扩容,

var group []stringfmt.Println(len(group))fmt.Println(cap(group))group=append(group,"hahaha")group[0]="abc"fmt.Println(len(group))fmt.Println(cap(group))fmt.Println(group[0])

输出

0011abc

append方法在slice长度不足的时候,会进行扩容,注释如下

// The append built-in function appends elements to the end of a slice. If// it has sufficient capacity, the destination is resliced to accommodate the// new elements. If it does not, a new underlying array will be allocated.// Append returns the updated slice. It is therefore necessary to store the// result of append, often in the variable holding the slice itself://  slice = append(slice, elem1, elem2)//  slice = append(slice, anotherSlice...)// As a special case, it is legal to append a string to a byte slice, like this://  slice = append([]byte("hello "), "world"...)func append(slice []Type, elems ...Type) []Type
0 0