我理解Go中数组和切片之间的区别.但我不明白的是为什么有数组是有帮助的.为什么数组类型定义指定长度和元素类型有帮助?为什么我们使用的每个"数组"都不能成为切片?
我有以下代码:
func main() {
var buf []byte{1, 2, 3, 4, 5}
buf = buf[2:]
fmt.Println(buf)
panic(1)
}
Run Code Online (Sandbox Code Playgroud)
但是我想将指向buf字节切片的指针传递给另一个函数,并将其切片到那里,所以类似于:
func main() {
var buf []byte{1, 2, 3, 4, 5}
sliceArr(&buf, 2)
fmt.Println(buf)
panic(1)
}
func sliceArr(buf *[]byte, i int) {
*buf = *buf[i:]
}
Run Code Online (Sandbox Code Playgroud)
它给了我一个错误,我不能在函数的参数中使用type []byte作为类型,并且我不能切片类型.怎么了?默认情况下,切片是否通过引用传递?我尝试在没有指针的情况下执行此操作,但它不起作用 - 正在复制数组.我怎样才能做到这一点?*[]bytesliceArr()*[]byte
这是从切片略微修改的代码
var buffer [256] byte
func SubtractOneFromLength(slice []byte) []byte {
slice = slice[0 : len(slice)-1]
return slice
}
func main() {
slice := buffer[10:20]
fmt.Println("Before: len(slice) =", len(slice))
newSlice := SubtractOneFromLength(slice)
fmt.Println("After: len(slice) =", len(slice))
fmt.Println("After: len(newSlice) =", len(newSlice))
newSlice2 := SubtractOneFromLength(newSlice)
fmt.Println("After: len(newSlice2) =", len(newSlice2))
}
Run Code Online (Sandbox Code Playgroud)
它表示slice参数的内容可以通过函数修改,但其标题不能.如何在屏幕上打印newSlice2的标题?