[英]append slice to slice from function parameter
我试图找出切片是如何工作的。 请查看以下代码
package main
import "fmt"
type ByteSlice []byte
func (p *ByteSlice) Append(data []byte) {
slice := *p
*p = append(slice, data...)
}
func main() {
var a ByteSlice
a[0] = 3
b := []byte{4,6,7}
a.Append(b)
fmt.Println(b)
}
正如您在append函数中看到的,我尝试将slice参数附加到调用中,但是我遇到以下错误:
panic: runtime error: index out of range
goroutine 16 [running]:
runtime.panic(0x4a14e0, 0x51333c)
c:/go/src/pkg/runtime/panic.c:279 +0xe9
main.main()
D:/Go/samples/src/method.go:16 +0x243
goroutine 17 [runnable]:
runtime.MHeap_Scavenger()
c:/go/src/pkg/runtime/mheap.c:507
runtime.goexit()
c:/go/src/pkg/runtime/proc.c:1445
goroutine 18 [runnable]:
bgsweep()
c:/go/src/pkg/runtime/mgc0.c:1976
runtime.goexit()
c:/go/src/pkg/runtime/proc.c:1445
goroutine 19 [runnable]:
runfinq()
c:/go/src/pkg/runtime/mgc0.c:2606
runtime.goexit()
c:/go/src/pkg/runtime/proc.c:1445
exit status 2
我错在哪里?
逐行查看我的评论:
切片只是数组的“视图”。
https://play.golang.org/p/gPppMHZncn
package main
import "fmt"
type ByteSlice []byte
func (p *ByteSlice) Append(data []byte) {
*p = append(*p, data...)
}
func main() {
var a ByteSlice // is just a pointer
// a[0] = 3 does not have memory allocate
a = append(a, 3) // append allocates a memory underneath
fmt.Println(a[0])
b := []byte{4, 6, 7}
a.Append(b)
fmt.Println(a)
}
产量
3 [3 4 6 7]
为了澄清另一个答案,错误是您尝试分配a[0]
。
要了解原因,首先需要了解切片的解剖结构。 切片由三个字段组成:
由于切片仅在逻辑上包含长度字段指定的元素数,因此您只能访问切片的许多元素。 事实上,您无法访问切片的未定义元素,就像使用C中的数组一样,这是一个安全功能。
初始化切片时,除非包含初始化元素或另行指定,否则其长度为0
。 你没有做过,因此a[0]
超出了范围。 你必须使用append
- a = append(a, 3)
特别是-到的第一个元素分配a
到3
。
有一篇Go博客文章更全面地讨论了这一点 。
另外,正如@fabrizioM指出的那样,没有必要在ByteSlice.Append
声明slice
变量; 你可以使用*p
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.