程式語言:Go
官網定義
簡介:Range 探討
range 會在執行 for 之前,被完整的執行過一次
也就是拆開的結果會被存在另一個變數中,再依序此變數執行 for 內的動作
但此變數是值還是位址,取決於不同的類型
而這只是通則,不適用在 map 上
官網定義
簡介:Range 探討
range 會在執行 for 之前,被完整的執行過一次
也就是拆開的結果會被存在另一個變數中,再依序此變數執行 for 內的動作
但此變數是值還是位址,取決於不同的類型
而這只是通則,不適用在 map 上
Range expression 1st value 2nd value array or slice a [n]E, *[n]E, or []E index i int a[i] E string s string type index i int see below rune map m map[K]V key k K m[k] V channel c chan E, <-chan E element e E
程式碼
array
取決是值 or 位址,決定是否會更改值
取決是值 or 位址,決定是否會更改值
The Go Playground
package main import ( "fmt" ) func main() { arr := [5]int{1, 2, 3, 4, 5} for i, v := range arr { arr[4] = 100 // 不改值 fmt.Printf("index:%d value:%d type:%T\n", i, v, v) } fmt.Println() for i, v := range &arr { arr[4] = 100 // 改值 fmt.Printf("index:%d value:%d type:%T\n", i, v, v) } }
slice
新增不影響,即使容量事先宣告
但修改值,若曾先 append 過,當原本的 cap 值不夠時,會被重新分配新的底層 array
新增不影響,即使容量事先宣告
但修改值,若曾先 append 過,當原本的 cap 值不夠時,會被重新分配新的底層 array
The Go Playground
package main import ( "fmt" ) func main() { arr1 := []int{1, 2, 3, 4, 5} for i, v := range arr1 { arr1[4] = 100 fmt.Printf("index:%d value:%d type:%T\n", i, v, v) } fmt.Println() arr2 := []int{1, 2, 3, 4, 5} for i, v := range arr2 { arr2 = append(arr2, 6) arr2[4] = 100 fmt.Printf("index:%d value:%d type:%T\n", i, v, v) } fmt.Println() arr3 := make([]int, 5, 10) arr3[0] = 1 arr3[1] = 2 arr3[2] = 3 arr3[3] = 4 arr3[4] = 5 for i, v := range arr3 { arr3 = append(arr3, 6) arr3[4] = 100 fmt.Printf("index:%d value:%d type:%T\n", i, v, v) } }
string
不更改值,新增也不影響
不更改值,新增也不影響
The Go Playground
package main import ( "fmt" ) func main() { str := "12345" for i, c := range str { str = "92345678" fmt.Printf("i:%d v:%c type:%T\n", i, c, c) } }
map
可能改值,可能不更改值,取決是否已跑過
可能加入,可能不加入,取決於 buffer,但仍是隨機
可能改值,可能不更改值,取決是否已跑過
可能加入,可能不加入,取決於 buffer,但仍是隨機
The Go Playground
package main import ( "fmt" ) func main() { m1:= make(map[string]string) m1["1"] = "1" m1["2"] = "2" m1["3"] = "3" m1["4"] = "4" m1["5"] = "5" m1["6"] = "6" for k, v := range m1{ m1["1"] = "100" m1["6"] = "100" m1["7"] = "7" m1["8"] = "8" m1["9"] = "9" m1["10"] = "10" m1["11"] = "11" m1["12"] = "12" fmt.Printf("k:%s v:%s type:%T\n", k, v, v) } fmt.Println() m2:= make(map[string]string,500) m2["1"] = "1" m2["2"] = "2" m2["3"] = "3" m2["4"] = "4" m2["5"] = "5" m2["6"] = "6" for k, v := range m2{ m2["7"] = "7" m2["8"] = "8" m2["9"] = "9" m2["10"] = "10" m2["11"] = "11" m2["12"] = "12" fmt.Printf("k:%s v:%s type:%T\n", k, v, v) } }
channel
取決傳入值的性質,決定是否更改值與加入
取決傳入值的性質,決定是否更改值與加入
The Go Playground
package main import ( "fmt" ) func run(c chan int){ arr := [5]int{1, 2, 3, 4, 5} for _, v := range arr { c <- v } close(c) } func main() { c := make(chan int) go run(c) for v := range c{ fmt.Printf("value:%d type:%T\n", v, v) } }The Go Playground
package main import ( "fmt" ) func run(c chan [5]int){ arr := [5]int{1, 2, 3, 4, 5} c <- arr close(c) } func main() { c := make(chan [5]int) go run(c) for v := range c{ fmt.Printf("value:%d type:%T\n", v, v) } }
留言
張貼留言