golang中一些基礎用法
阿新 • • 發佈:2018-12-31
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, 999 fmt.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, 999 fmt.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 <- 1 b <- 2 go 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) }