42

golang slice index out of range错误

 3 years ago
source link: https://blog.csdn.net/oqqYuan1234567890/article/details/56847555
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

golang slice index out of range错误

皿小草 2017-02-24 18:17:03 7894

直接上代码

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

编译正常,运行报错如下

panic: runtime error: index out of range

goroutine 1 [running]:
panic(0x47a880, 0xc42000a110)
    /opt/tools/go1.7.3/src/runtime/panic.go:500 +0x1a1
main.main()
    /opt/IdeaProjects/test-embeded-struct/main.go:11 +0x14
exit status 2

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

    var group []string
    fmt.Println(len(group))
    fmt.Println(cap(group))
    group[0]="abc"
    fmt.Println(group[0])
0
0
panic: runtime error: index out of range

goroutine 1 [running]:
panic(0x48fec0, 0xc42000a110)
    /opt/tools/go1.7.3/src/runtime/panic.go:500 +0x1a1
main.main()
    /opt/IdeaProjects/test-embeded-struct/main.go:13 +0x10a
exit 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 []string
fmt.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])
0
0
1
1
abc

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK