Go 从函数参数将切片追加到切片
我想知道slice是如何工作的。请看下面的代码Go 从函数参数将切片追加到切片,go,Go,我想知道slice是如何工作的。请看下面的代码 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
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
我这里有什么错?请逐行查看我的评论: 切片只是数组的“视图” 输出 三,
[3 4 6 7]为了澄清另一个答案,该错误是您试图分配[0]的结果 要了解原因,首先需要了解切片的解剖结构。切片由三个字段组成:
- 其长度(在切片中指定的元素数)
- 其容量(底层阵列的实际大小,可以调整大小)
- 指向基础数组的指针
0
,除非包含初始化元素或另行指定。您都没有,因此a[0]
超出范围。您必须使用append
-a=append(a,3)
,特别是-将a
的第一个元素分配给3
有一个
另外,正如@fabrizioM所指出的,不需要在ByteSlice.Append
中声明slice
变量;您只需使用*p
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)
}