2 回答

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個贊
這里發(fā)生了兩件不同的事情,兩者都阻止了它的行為如你所料:
func pop(s []int) int { first, s := s[0], s[1:]
第一個(也是更簡單的)問題是你在s
這里定義了一個新的局部變量,它會影響你的函數(shù)參數(shù)s
。
其次,切片確實(shí)指向一個底層數(shù)組,但切片仍然通過副本傳遞,就像其他所有內(nèi)容一樣。這意味著:
s = s[1:]
修改您的 s 副本以在基礎(chǔ)數(shù)組上具有不同的窗口。這不會改變調(diào)用者中的切片。但是,如果您更改底層數(shù)組中的值,這將反映在調(diào)用者中,例如:
s[1] = 42
您可以在整個 Tour和Go 博客上了解更多信息。

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個贊
該行first, s := s[0], s[1:]創(chuàng)建了一個新變量s,因?yàn)槟褂玫氖?=. 最重要的是,如果要修改切片,則需要通過指針傳遞它。
通過值傳遞它,它將引用相同的底層數(shù)組,但切片本身是一個副本。因此,對底層數(shù)組的更改將反映在 中main,但對切片本身的更改不會。
這是一個通過指針傳遞切片的示例。
package main
import (
"fmt"
)
func pop(s *[]int) int {
first := (*s)[0]
*s = (*s)[1:]
return first
}
func main() {
s := []int{0, 1, 2, 3}
first := pop(&s)
fmt.Println(first, s)
}
- 2 回答
- 0 關(guān)注
- 120 瀏覽
添加回答
舉報