Go 语言基础(三) 之 函数
生活随笔
收集整理的這篇文章主要介紹了
Go 语言基础(三) 之 函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
內建函數 1、預定義了少數函數,這意味著無需引用任何包就可以使用它們 close 用于 channel 通訊。 delete 用于在 map 中刪除實例 len 和 cap 可用于不同的類型, len 用于返回字符串、slice 和數組的長度。 new 用于各種類型的內存分配。 make 用于內建類型(map、slice 和 channel)的內存分配。 copy 用于復制 slice。 append 用于追加 slice。 panic 和 recover 用于異常處理機制。 print 和 println 是底層打印函數,可以在不引入 fmt 包的情況下使用。它們 主要用于調試。 complex、real 和 imag 全部用于處理 復數。 可以利用 array 在列表中進行多個值的排序,或者使用更加靈活的:slice。字典 或哈希類型同樣可以使用,在 Go 中叫做 map。 2、array array 由 [n]<type> 定義, n 標示 array 的長度,而 <type> 標示希望存儲的內容的 類型。 對 array 的元素賦值或索引是由方括號完成的: var arr [10]int arr[0] = 42 arr[1] = 13 fmt.Printf("The first element is %d\n", arr[0]) 像 var arr = [10]int 這樣的數組類型有固定的大小。大小是類型的一部分。由于不同的大小是不同的類型,因此不能改變大小。 數組同樣是值類型的:將一個數組賦值給另一個數組,會復制所有的元素。 尤其是當向函數內傳遞一個數組的時候,它會獲得一個數組的副本,而不是數組的指針。 可以像這樣聲明一個數組:var a [3]int,如果不使用零來初始化它, 則用復合聲明:a := [3]int{1, 2, 3} 也可以簡寫為 a := [...]int{1, 2, 3},Go 會自動統計元素的個數。 注意,所有項目必須都指定。因此,如果你使用多維數組,有一些內容你必須錄入: a := [2][2]int{ [2]int{1,2}, [2]int{3,4} } 類似于: a := [2][2]int{ [...]int{1,2}, [...]int{3,4} } 當聲明一個 array 時,你必須在方括號內輸入些內容,數字或者三個點 (...)。 3、slice slice 與 array 接近,但是在新的元素加入的時候可以增加長度。 slice 總是指向底層的一個 array。 slice 是一個指向 array 的指針,這是其與 array 不同的地方; slice 是引用類型,這意味著當賦值某個 slice 到另外一個變量,兩個引用會指向同一個 array。 例如,如果一個函數需要一個 slice 參數,在其內對 slice 元素的修改也會體現在函數調用者中, 這和傳遞底層的 array 指針類似。通過: sl := make([]int, 10) 創建了一個保存有 10 個元素的 slice。需要注意的是底層的 array 并無不同。 slice 總是與一個固定長度的 array 成對出現。其影響 slice 的容量和長度。 首先創建了 m 個元素長度的 array, 元素類型 int: var array[m]int 然后對這個 array 創建 slice: slice := array[0:n] 然后現在有: ? len(slice)== n ; ? cap(slice)== m ; ? len(array)== cap(array)== m 4、map 在 Go 中有 map 類型。map 可以認為是一個用字符串做索引的數組(在其最簡單的形式下)。 下面定義了 map 類型,用于將 string(月的縮寫) 轉換為 int – 那個月的天數。 一般定義 map 的方法是:map[<from type>]<to type> monthdays := map[string]int{ "Jan": 31, "Feb": 28, "Mar": 31, "Apr": 30, "May": 31, "Jun": 30, "Jul": 31, "Aug": 31, "Sep": 30, "Oct": 31, "Nov": 30, "Dec": 31, ← 逗號是必須的 } 留意,當只需要聲明一個 map 的時候,使用 make 的形式: monthdays := make(map[string]int) 當在 map 中索引(搜索)時,使用方括號。 例如打印出 12 月的天數: fmt. Printf("%d\n", monthdays["Dec"]) 當對 array、slice、string 或者 map 循環遍歷的時候, range 會幫助你,每次調用,它都會返回一個鍵和對應的值。 year := 0 for _, days := range monthdays { ← 鍵沒有使用,因此用 _, days year += days } fmt.Printf("Numbers of days in a year: %d\n", year) 向 map 增加元素,可以這樣做: monthdays["Undecim"] = 30 ← 添加一個月 monthdays["Feb"] = 29 ← 年時重寫這個元素 檢查元素是否存在,可以使用下面的方式: var value int var present bool value, present = monthdays["Jan"] ← 如果存在,present 則有值 true ← 或者更接近 Go 的方式 v, ok := monthdays["Jan"] ← “逗號 ok”形式 也可以從 map 中移除元素: delete(monthdays, "Mar") ← 刪除"Mar" 吧,總是下雨的月 通常來說語句 delete(m, x) 會刪除 map 中由 m[x] 建立的實例。 八、函數 1、函數是構建 Go 程序的基礎部件 type mytype int ← 新的類型,參閱第 5 章 func (p mytype) funcname(q int) (r,s int) { return 0,0 } 函數沒有返回值: func subroutine(in int) { return } 簡單的將輸入返回: func identity(in int) int { return in } 遞歸函數: func rec(i int) { if i == 10 { return } rec(i+1) fmt.Printf("%d ", i) } 這會打印:9 8 7 6 5 4 3 2 1 0。 2、作用域 定義在函數外的變量是全局的,那些定義在函數內部的變量,對于 函數來說是局部的。如果命名覆蓋——一個局部變量與一個全局變量有相同的 名字——在函數執行的時候,局部變量將覆蓋全局變量 package main var a int func main() { a=5 println(a) f() } func f() { a := 6 println(a) g() } func g() { println(a) } 輸出內容將是:565。 局部變量僅僅在執行定義它的函數時有效 3、多值返回 函數和方法可以返回多個值 func nextInt(b []byte, i int) (int, int) { x := 0 // 假設所有的都是數字 for ; i < len(b); i++ { x = x*10 + int(b[i])-'0' } return x, i } 你可以在輸入的數組中掃描數字,像這樣: a := []byte{'1', '2', '3', '4'} var x int for i := 0; i < len(a); { ← 沒有 i++ x, i = nextInt(a, i) println(x) } 4、命名返回值??? 5、延遲代碼??? 假設有一個函數,打開文件并且對其進行若干讀寫。在這樣的函數中,經常有 提前返回的地方。如果你這樣做,就需要關閉正在工作的文件描述符。 defer 語句。 在 defer 后指定的函數會在函數退出前調用。 for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) } 延遲的函數是按照后進先出(LIFO)的順序執行,所以上面的代碼打印: 4 3 2 1 0。 在 defer 中訪問返回值 func f() (ret int) { ← ret 初始化為0 defer func() { ret++ ← ret 增加為1 }() return 0 ← 返回的是1 而不是0 } 6、變參 接受變參的函數是有著不定數量的參數的 func myfunc(arg ...int) {} arg ... int 告訴 Go 這個函數接受不定數量的參數 7、函數作為值 函數也是值 匿名函數 func main() { a := func() { ← 定義一個匿名函數,并且賦值給 a println("Hello") } ← 這里沒有 () a() ← 調用函數 } 如果使用 fmt.Printf("\%T\n", a) 打印 a 的類型,輸出結果是 func()。 8、回調 當函數作為值時,就可以很容易的傳遞到其他函數里,然后可以作為回調。 首先定義一個函數,對整數做一些 “事情”: func printit(x int) { ← 函數無返回值 fmt.Print("%v\n", x) ← 僅僅打印 } 這個函數的標識是 func printit(int),或者沒有函數名的:func(int)。 創建新的函數使用這個作為回調,需要用到這個標識: func callback(y int, f func(int)) { ← f 將會保存函數 f(y) ← 調用回調函數 f 輸入變量 y }
轉載于:https://www.cnblogs.com/wjq310/p/6545481.html
總結
以上是生活随笔為你收集整理的Go 语言基础(三) 之 函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 增大hadoop client内存
- 下一篇: 修改input的text 通过jquer