append函數(shù)返回更新后的slice(長度和容量可能會變),必須重新用slice的變量接收夫啊,不然無法編譯通過
為了弄明白為什么蛋哭,首先我們需要清楚幾件事:
- slice的底層是數(shù)組,一片連續(xù)的內(nèi)存涮母,slice變量只是存儲該slice在底層數(shù)組的起始位置谆趾、結束位置以及容量。
- 它的長度可以通過起始位置和結束位置算出來叛本,容量也可以通過起點位置到底層數(shù)組的末端位置的長度算出來沪蓬,多個slice可以指向同一個底層數(shù)組。所以slice和數(shù)組指針不同来候,數(shù)組指針主要存儲底層數(shù)組的首地址跷叉。
- 因為Go函數(shù)傳遞默認是值拷貝,將slice變量傳入append函數(shù)相當于傳了原slice變量的一個副本营搅,注意不是拷貝底層數(shù)組云挟,因為slice變量并不是數(shù)組,它僅僅是存儲了底層數(shù)組的一些信息转质。
所以說园欣,當它改變傳入的slice變量的信息,原slice變量并不會有任何變化休蟹,打印原slice變量和之前也會一模一樣沸枯。該函數(shù)會返回修改后的slice變量,因為原slice并不會變赂弓,假如沒有任何slice變量接收返回的值绑榴,那么此次append操作就沒有意義了。所以必須要有slice變量重新接收修改后的slice變量盈魁,不然編譯器會報錯翔怎。Go不希望你做無意義的事,就像導入的包或定義的變量沒有用上,它也會報錯赤套。
個人是這樣理解的飘痛,如有不對之處還請指正。