程式語言: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
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)
- }
- }
- 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)
- }
- }
留言
張貼留言