不可或缺的函數,在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