1 回答

TA貢獻1744條經驗 獲得超4個贊
切片是指向底層數組的指針。在 Golang 中是這樣描述的:
映射和切片值的行為類似于指針:它們是包含指向底層映射或切片數據的指針的描述符。復制映射或切片值不會復制它指向的數據。復制接口值會復制存儲在接口值中的內容。如果接口值包含結構,則復制接口值會復制該結構。如果接口值包含一個指針,則復制接口值會復制指針,但同樣不會復制它指向的數據。
您傳遞的是切片的副本而不是原始切片。返回附加到切片后的值,然后將其分配給原始切片作為
package main
import (
"fmt"
)
func main() {
a := []int{1, 2, 3}
a = change(a)
fmt.Println(a)
}
func change(a []int) []int{
a = append(a, 5)
return a
}
游樂場示例
或者你可以傳遞一個指向 slice of int 的指針,但不推薦這樣做,因為 slice it 本身是一個指向引導程序數組的指針。
package main
import (
"fmt"
)
func main() {
a := []int{1, 2, 3}
change(&a)
fmt.Println(a)
}
func change(a *[]int){
*a = append(*a, 5)
}
注意:Golang 中的一切都是按值傳遞的。
需要考慮的一件事是,即使您返回更新后的切片并分配給相同的值,其原始的 len 和 cap 也會發生變化,這將導致一個新的不同 len 的底層數組。嘗試打印更改切片前后的長度和上限以查看差異。
fmt.Println(len(a), cap(a))
長度是切片引用的元素數。容量是底層數組中元素的數量(從切片指針引用的元素開始)。
由于底層數組將檢查你可以使用反射和不安全來檢查它來獲取底層數組,如果在你的情況下附加數據后切片的上限發生變化,這將是不同的。
package main
import (
"fmt"
"reflect"
"unsafe"
)
func main() {
a := []int{1, 2, 3}
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&a))
data := *(*[3]int)(unsafe.Pointer(hdr.Data))
fmt.Println(data)
a = change(a)
hdr = (*reflect.SliceHeader)(unsafe.Pointer(&a))
newData := *(*[4]int)(unsafe.Pointer(hdr.Data))
fmt.Println(newData)
}
func change(a []int) []int {
a = append(a, 5)
return a
}
游樂場示例
這是切片最好的部分,當附加數據超過其容量時,您需要擔心它的容量,因為它將指向分配在更大長度內存中的新數組。
- 1 回答
- 0 關注
- 110 瀏覽
添加回答
舉報