golang函數——可以為類型(包括內置數據類型)定義函數,類似類方法,同時支持多返回值


不可或缺的函數,在Go中定義函數的方式如下:

func (p myType ) funcName ( a, b int , c string ) ( r , s int ) {
    return
}

通過函數定義,我們可以看到Go中函數和其他語言中的共性和特性

共性

  • 關鍵字——func
  • 方法名——funcName
  • 入參——— a,b int,b string
  • 返回值—— r,s int
  • 函數體—— {}

特性

Go中函數的特性是非常酷的,給我們帶來不一樣的編程體驗。

為特定類型定義函數,即為類型對象定義方法

在Go中通過給函數標明所屬類型,來給該類型定義方法,上面的 p myType 即表示給myType聲明了一個方法, p myType 不是必須的。如果沒有,則純粹是一個函數,通過包名稱訪問。packageName.funcationName

如:

//定義新的類型double,主要目的是給float64類型擴充方法
type double float64

//判斷a是否等於b
func (a double) IsEqual(b double) bool {
    var r = a - b
    if r == 0.0 {
        return true
    } else if r < 0.0 {
        return r > -0.0001
    }
    return r < 0.0001
}

//判斷a是否等於b
func IsEqual(a, b float64) bool {
    var r = a - b
    if r == 0.0 {
        return true
    } else if r < 0.0 {
        return r > -0.0001
    }
    return r < 0.0001
}

func main() {
    var a double = 1.999999
    var b double = 1.9999998
    fmt.Println(a.IsEqual(b))
    fmt.Println(a.IsEqual(3))
    fmt.Println( IsEqual( (float64)(a), (float64)(b) ) )

}

上述示例為 float64 基本類型擴充了方法IsEqual,該方法主要是解決精度問題。 其方法調用方式為: a.IsEqual(double) ,如果不擴充方法,我們只能使用函數IsEqual(a, b float64)

入參中,如果連續的參數類型一致,則可以省略連續多個參數的類型,只保留最后一個類型聲明。

func IsEqual(a, b float64) bool 這個方法就只保留了一個類型聲明,此時入參a和b均是float64數據類型。 這樣也是可以的: func IsEqual(a, b float64, accuracy int) bool

變參:入參支持變參,即可接受不確定數量的同一類型的參數

func Sum(args ...int) 參數args是的slice,其元素類型為int 。經常使用的fmt.Printf就是一個接受任意個數參數的函數 fmt.Printf(format string, args ...interface{})

支持多返回值

前面我們定義函數時返回值有兩個r,s 。這是非常有用的,我在寫C#代碼時,常常為了從已有函數中獲得更多的信息,需要修改函數簽名,使用out ,ref 等方式去獲得更多返回結果。

 

而現在使用Go時則很簡單,直接在返回值后面添加返回參數即可。

 

摘自:http://www.cnblogs.com/howDo/archive/2013/06/04/GoLang-function.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM