在 Golang 中,一切都是按值傳遞的。如果我“直接”傳遞一個陣列(而不是通過指標傳遞它),那么在函式中所做的任何修改都將在它之外找到
func f(a []int) {
a[0] = 10
}
func main() {
a := []int{2,3,4}
f(a)
fmt.Println(a)
}
Output: [10 3 4]
這是因為,據我了解,陣列構成(除其他外)指向底層資料陣列的指標。
除非我弄錯了(參見此處),字串還構成(連同“len”物件)指向unsafe.Pointer基礎資料的指標 (a)。因此,我期待與上述相同的行為,但顯然我錯了。
func f(s string) {
s = "bar"
}
func main() {
s := "foo"
f(s)
fmt.Println(s)
}
Output: "foo"
字串在這里發生了什么?當字串作為引數傳遞時,似乎正在復制基礎資料。
相關問題:當??我們不希望我們的函式修改字串時,出于性能原因,是否仍然建議通過指標傳遞大字串?
uj5u.com熱心網友回復:
Astring中有兩個值:指向陣列的指標和字串長度。當您將字串作為引數傳遞時,將復制這兩個值,而不是底層陣列。
除了使用 . 之外,沒有其他方法可以修改字串的內容unsafe。當您將 a 傳遞*string給函式并且該函式修改字串時,該函式只是修改字串以指向不同的陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/437189.html
