這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
range類似迭代器操作,返回 (索引, 值) 或 (鍵, 值)。其可以使用的對象包括string,array/slice,map,channel。其中string,array/slice返回的第一個value都是index,第二個value表示值;map返回第一個元素為key,第二個為value;channel中第一個值為元素的值。
舉例如下:
func main() {str := "abcdef"for key, value := range str {fmt.Printf("%d,%c\n", key, value)} array := [3]int{0, 1, 2}//注意,針對array,range 會複製對象。for i, v := range array {if i == 0 {// index、value 都是從複製品中取出。// 在修改前,我們先修改原數組。array[1], array[2] = 999, 999fmt.Println(array)// 確認修改有效,輸出 [0, 999, 999]。}array[i] = v + 100 // 使用用複製品中取出的 value 修改原數組。}fmt.Println(array) // 輸出 [100, 101, 102]。//slice 為引用,對slice引用修改時直接在原來slice上進行修改,不用進行複製,建議改用用引用用類型,其底層資料不會被複製。slice := []int{0, 1, 2}for i, v := range slice {if i == 0 {// 在修改前,我們先修改原數組。slice[1], slice[2] = 999, 999fmt.Println(slice)// 確認修改有效,輸出 [0, 999, 999]。}slice[i] = v + 100}fmt.Println(slice) // 輸出 [100 1099 1099]。a := make(map[int]string, 3)a[1] = "as"a[2] = "c"for key, value := range a {fmt.Println(key, value)}b := make(chan int, 3)b <- 1b <- 2go func() {for element:= range b {fmt.Println(element)}}()time.Sleep(1 * time.Second)}
函數:
函數定義
不支支援 嵌套 (nested)、重載 (overload) 和 預設參數 (default parameter)。
• 無無需聲明原型。
• 支支援不定⻓長變參。
• 支支援多傳回值。
• 支支援命名返回參數。
• 支支援匿名函數和閉包。
函數是第一一類對象,可作為參數傳遞。建議將複雜簽名定義為函數類型,以便於閱讀。
func test(fn func() int) int {return fn()}<span style="background-color: rgb(255, 0, 0);">type FormatFunc func(s string, x, y int) string// 定義函數類型。func format(fn FormatFunc, s string, x, y int) string {return fn(s, x, y)}</span>func main() {s1 := test(func() int { return 100 })// 直接將匿名函數當參數。s2 := format(func(s string, x, y int) string {return fmt.Sprintf(s, x, y)}, "%d, %d", 10, 20)println(s1, s2)}