1. 程式人生 > >golang中一些基礎用法

golang中一些基礎用法

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)
}