Golang 函數

函數聲明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) }
  1. 能夠隨時在代碼裏定義匿名函數,而且將這個匿名函數 賦值 給一個變量。
  2. 能夠隨時定義匿名函數,而且 執行這個 匿名函數。(聲明函數的時候,直接執行!)
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. 匿名函數中 能夠 直接使用 上級函數中的變量(這也是其一個方便的用處)

defer 語句

  1. defer 語句 向函數進行註冊。
  2. 在函數退出的時候執行(不管函數是 panic()仍是正常退出)
  3. defer 註冊語句遵循 」先註冊,後執行「的順序
  4. 能夠 用 defer 語句進行一些資源清理工做。

Golang 異常恢復機制

golang 的 異常恢復機制,是採用 panic() / recover() 的機制。 

更詳細的內容可見http://studygolang.com/articles/6238

相關文章
相關標籤/搜索