Go Web 編程 一書第52頁中的錯誤: string 並非類似指標類型

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

<< Go Web 編程>> 一書 第 52 頁說到:

Go 語言中 string,slice,map 這三種類型的實現機制類似指標,所以可以直接傳遞, 而不用取地址後傳遞指標。

 這個說法套在 string 上, 是錯誤的。

package mainimport "fmt"func add1(a string) string {a = a + " simida"return a}func main() {x := "I am Jon"fmt.Println("x = ", x)x1 := add1(x)fmt.Println("x + 1 = ", x1)fmt.Println("x = ", x)/*output:x =  I am Jonx + 1 =  I am Jon simidax =  I am Jon*/}

 以上例子中 x 的值在調用函數add1()之後無變化.

 

package mainimport "fmt"func add1(a *string) string {*a = *a + " simida"return *a}func main() {x := "I am Jon"fmt.Println("x = ", x)x1 := add1(&x)fmt.Println("x + 1 = ", x1)fmt.Println("x = ", x)/*output:x =  I am Jonx + 1 =  I am Jon simidax =  I am Jon simida*/}

 採用指標傳遞, 則調用函數之後x值發生變化.

由此可見, string 類型的實現機制 並非 類似指標.

 

而 slice 和 map 的實現機制則類似指標, 所以不必取地址傳遞指標.

package mainimport "fmt"func add1(a []int) []int {for k, v := range a {a[k] = v + 1}return a}func main() {x := make([]int, 2, 6)fmt.Println("x = ", x)x1 := add1(x)fmt.Println("x + 1 = ", x1)fmt.Println("x = ", x)/*output:x =  [0 0]x + 1 =  [1 1]x =  [1 1]*/}

 

 

package mainimport "fmt"func add1(a map[string]int) map[string]int {for k, v := range a {a[k] = v + 1}return a}func main() {x := map[string]int{"a": 0, "b": 0}fmt.Println("x = ", x)x1 := add1(x)fmt.Println("x + 1 = ", x1)fmt.Println("x = ", x)/*output:x =  map[a:0 b:0]x + 1 =  map[a:1 b:1]x =  map[a:1 b:1]*/}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.