我讀了這篇制作了一些樣本的文章,但我沒能猜出其中一些的輸出......
第一個(操場):
package main
import "fmt"
func surprise(a []int) {
for i := range(a) {
a[i] = 5
}
fmt.Println(a)
}
// Quiz #1
func main() {
a := []int{1, 2, 3, 4}
surprise(a)
fmt.Println(a)
}
輸出
[5 5 5 5]
[5 5 5 5]
第二個(操場):
package main
import "fmt"
func surprise(a []int) {
a = append(a, 5)
for i := range(a) {
a[i] = 5
}
fmt.Println(a)
}
// Quiz #2
func main() {
a := []int{1, 2, 3, 4}
surprise(a)
fmt.Println(a)
}
輸出:
[5 5 5 5 5]
[1 2 3 4]
所以我認為這是因為在第二個樣本切片值被復制到本地函式。但后來我對第四個樣本(游樂場)感到驚訝:
package main
import "fmt"
func surprise(a []int) {
a = append(a, 5)
for i := range(a) {
a[i] = 5
}
fmt.Println(a)
}
// Quiz #4
func main() {
a := []int{1, 2, 3, 4}
a = append(a, 5)
surprise(a)
fmt.Println(a)
}
輸出:
[5 5 5 5 5 5]
[5 5 5 5 5]
那為什么呢?
uj5u.com熱心網友回復:
切片是陣列的視圖。當您將新值附加到沒有足夠容量的切片時,將分配一個具有更大容量的新陣列,并將舊陣列的內容復制到新陣列中。
所以在第二種情況下,切片被附加到函式中,所以此時分配了一個新陣列,函式將新陣列的所有值設定為 5。 main 中的切片保持不變。
在第三種情況下,切片附加在 main 中,這會創建一個新陣列,其大小是原始陣列的兩倍。當函式向該陣列追加一個新值時,不需要調整它的大小,因此 main 和函式都在同一個底層陣列上作業,不同之處在于函式中的切片比 main 中的切片大一。不過,它們都共享相同的底層陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/438840.html
標籤:走
