切片和append操做

本文轉自:http://meia.fun/article/1541470004286golang

學習切片時,被append這個方法困擾了半天:在main方法中把一個切片做爲實參傳遞給另外一個函數,並在這個函數內調用append方法爲切片形參添加一個元素後,main方法的切片實參竟然沒有輸出添加的元素。數組

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 func main() {
 8 
 9     var a []string = make([]string, 0, 10)
15     test(a)
16     fmt.Println(a)
17 }
18 
19 func test(t []string) {
20     t = append(t, "a")
21     fmt.Println(t)
22 }
23 --------------------------------------------------------output
24 E:/go/bin/go.exe run template.go [D:/goProjects]
25 [a]
26 []
27 成功: 進程退出代碼 0.

首先要明白一點,切片是由指針(指向底層數組)、len、cap三個元素構成。在上面代碼中a和t這兩個切片的底層數組是相同的(但a和t是兩個不一樣的切片,golang中只有值傳遞,在調用test時copy了切片a給t),按理來講兩個切片的輸出結果應該是同樣的,但是輸出的結果確不同,緣由是由於append方法不會修改原切片,只會返回更新(切片的長度、容量)後的切片並添加元素到底層數組或分配新的底層數組(在切片容量不足的時候),上面代碼中其實兩個切片底層共享的數組已經修改了的,可是golang在輸出切片時僅輸出切片長度內的內容,因此不擴展下切片  看不到另一個切片append的元素。app

代碼修改以下,便可看到append的元素:函數

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 func main() {
 8 
 9     var a []string = make([]string, 0, 10)
10     test(a)
11     fmt.Println(a)
12     fmt.Println(a[:10])
13 }
14 
15 func test(t []string) {
16     t = append(t, "a")
17     fmt.Println(t)
18 }
23 --------------------------------------------------------output
24 E:/go/bin/go.exe run template.go [D:/goProjects] 25 [a] 26 []
  [a    ] 27 成功: 進程退出代碼 0.

實際開發中,在golang 裏面有個簡單的原則,修改什麼就傳什麼的指針,這裏修改slice自身,就傳slice的指針:學習

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     s1 := make([]int, 0, 5)
 7     test(&s1)
 8     fmt.Println(s1)
 9 }
10 func test(s *[]int) {
11     *s = append(*s, 3)
12     fmt.Println(*s)
13 }
相關文章
相關標籤/搜索