函數聲明golang
func (p myType ) funcName ( a, b int , c string ) ( r , s int ) { return數組 }安全 |
func 關鍵字app
(p myType) 代表 函數所屬於的類型對象!,即爲特定類型定義方法,能夠省去不寫,即爲普通的函數 (這裏咱們主要講解 普通的函數)函數
函數名ui
參數 (能夠不聲明)spa
返回值 (能夠不聲明)code
函數體對象
Golang 提供了 大量的包和實用函數 供用戶使用,這些函數被稱爲標準函數。常見的標準包有 fmt, math, os, time bytes
通常包名都是小寫。、
標準包的消息能夠在 Go安裝目錄的 pkg 下面查看,也可使用godoc 查看。blog
一般,一個可執行的Go程序通常都有一個 main 包,在 main包中必須聲明一個 main 函數。
若是須要調用外部包的函數,那麼須要導入這個包,才能調用相關函數(首字母必須大寫)。
13個內置函數,這些內置函數,很是有用。 len()
:能夠獲取數組,字符串,切片的長度 panic()
能夠直接做用於系統底層,用於錯誤處理。
形式參數的 類型 和 個數 都是能夠變化的。
典型的變參函數有: fmt.Printf(), fmt.Scanf() exec.Command() 等
func functionName (variableArgumetName ... dataType) returnValue {...}
(1) 變參的類型是」…類型「,並且變參必須是函數的最後一個參數。若是函數還有其餘的參數,好比放在 變參的前面。 func f1(a int ,s string, args ...int) {...}
(2) 不定長 的變參,實際上就是一個切片,可使用 range 進行遍歷。
一個變參函數,如何將這些變參傳遞給另一個 變參函數呢?
由於實際上變參就是一個切片,因此能夠進行所有的傳遞,也能夠進行部分的傳遞。
當用戶但願傳遞不一樣類型的參數的時候,就像 fmt.Printf() 能夠接受 int string 等各類類型。
此時,應該指定 變參 類型爲爲 空接口 interface{}
func f1(args... interface{}) //指定變參類型爲 interface{}
在Go語言中,interface{} 能夠指向任何數據類型,因此可使用 interface{}定義任意類型的變參。 同時 interface{] 也是類型安全的。
package main import ( "fmt" ) func main() { f1(2, "go", 8, "language", 'a', false, "A", 3.24) } // 採用 interface {} 做爲類型 func f1(args ...interface{}) { var num = make([]int, 0, 6) var str = make([]string, 0, 6) var ch = make([]int32, 0, 6) //字符類型,是int32的哦! var other = make([]interface{}, 0, 6) //採用 interface{}做爲類型 for _, arg := range args { switch v := arg.(type) { //這個是什麼用法? case int: num = append(num, v) case string: str = append(str, v) case int32: //這裏 'a' 被統計到了 int32中。 ch = append(ch, v) default: other = append(other, v) } } fmt.Println(num) fmt.Println(str) fmt.Println(ch) fmt.Println(other) } 輸出爲: [2 8] [go language A] [97] [false 3.24]
能夠看到: Go 語言是類型安全的。 int
類型和 int32
不是同一個類型,可是應該是兼容的。 字符 字面值 被當作rune
類型(也就是 int32
類型,可是不是 int
類型 )
聲明:
func (參數列表)(返回值){函數體} //注意沒有函數名,因此稱爲匿名函數 func (a, b int) int { return (a + b) }
package main import ( "fmt" ) func main() { //聲明 而且直接將 匿名函數 賦值 給變量f f := func(a, b int) int { return a + b } // 對函數類型的變量盡心調用 sum := f(2, 3) fmt.Println(sum) // 聲明 而且 直接執行 匿名函數 sum = func(a, b int) int { return a + b }(2, 3) fmt.Println(sum) }
注意: 使用 匿名函數,不能將它做爲頂級函數使用,也就是說必定要將它放在其餘函數的函數體中。
2. 匿名函數中 能夠 直接使用 上級函數中的變量(這也是其一個方便的用處)
golang 的 異常恢復機制,是採用 panic() / recover() 的機制。