Go 函數編程

 

 

函數的聲明

在 Go 語言中,函數聲明通用語法以下:函數

func functionname(parametername type) returntype {  
    // 函數體(具體實現的功能)
}

函數的聲明以關鍵詞 func 開始,後面緊跟自定義的函數名 functionname (函數名)。函數的參數列表定義在 ( 和 ) 之間,返回值的類型則定義在以後的 returntype (返回值類型)處。聲明一個參數的語法採用 參數名 參數類型 的方式,任意多個參數採用相似 (parameter1 type, parameter2 type) 即(參數1 參數1的類型,參數2 參數2的類型)的形式指定。以後包含在 { 和 } 之間的代碼,就是函數體。spa

函數中的參數列表和返回值並不是是必須的,因此下面這個函數的聲明也是有效的code

func functionname() {  
    // 譯註: 表示這個函數不須要輸入參數,且沒有返回值
}

  

示例程序

package main

import "fmt"


//傳入單個參數
func functionname1(parametername int){
	fmt.Printf("參數:%d\n",parametername);
}

//傳入單個參數,單個返回值
func functionname2(parametername int) int{
	fmt.Printf("參數:%d\n",parametername);
	return parametername*parametername;
}

//傳入多個參數
func functionname3(parametername1 int,parametername2 int){
	fmt.Printf("參數1:%d\n",parametername1);
	fmt.Printf("參數2:%d\n",parametername2);
}

//傳入多個參數,多個返回值
func functionname4(parametername1 int,parametername2 int)(int,int){
	fmt.Printf("參數1:%d\n",parametername1);
	fmt.Printf("參數2:%d\n",parametername2);
	return parametername1*parametername2,parametername1+parametername2;
}



func main(){
	a := 1;
	b := 2;
	functionname1(a);
	functionname2(a);
	functionname3(a,b);
	functionname4(a,b);
}

  

命名返回值

從函數中能夠返回一個命名值。一旦命名了返回值,能夠認爲這些值在函數第一行就被聲明爲變量了。blog

上面的 rectProps 函數也可用這個方式寫成:教程

func rectProps(length, width float64)(area, perimeter float64) {  
    area = length * width
    perimeter = (length + width) * 2
    return // 不須要明確指定返回值,默認返回 area, perimeter 的值
}

請注意, 函數中的 return 語句沒有顯式返回任何值。因爲 area 和 perimeter 在函數聲明中指定爲返回值, 所以當遇到 return 語句時, 它們將自動從函數返回。get

 

函數導出與首字母大寫

以程序導入gotest/even包爲例
package main

import (
    "even"
    "fmt"
)

func main() {
    i:=even.I
    fmt.Printf("Is %d even? %v\n", i, even.Even(i))
}

package even

var I int = 123

 func Even(i int) bool {
    return i%2==0
}

func odd(i int) bool {
    return i%2!=0
}

1.本地包 even 在這裏導入;
2. 官方 fmt 包導入;
3.調用 even 包中的函數。訪問一個包中的函數的語法是 <package>.Function(),變量 <package>.Var。
在 Go 中,當變量或函數的首字母大寫的時候,函數會被從包中導出(在包外部可見,或者說公有的),所以函數名是 Even。若是修改main.go 的第 10 行,使用未導出的函數 even.odd:
fmt.Printf("Is %d even? %v\n", i, even.odd(i))

因爲使用了私有的函數,會獲得一個編譯錯誤:
main.go:10: cannot refer to unexported name even.odd

歸納來講:
 公有函數的名字以大寫字母開頭;
私有函數的名字以小寫字母開頭。

 

 

空白符

_ 在 Go 中被用做空白符,能夠用做表示任何類型的任何值。io

咱們繼續以 rectProps 函數爲例,該函數計算的是面積和周長。假使咱們只須要計算面積,而並不關心周長的計算結果,該怎麼調用這個函數呢?這時,空白符 _ 就上場了。編譯

下面的程序咱們只用到了函數 rectProps 的一個返回值 areafunction

package main

import (  
    "fmt"
)

func rectProps(length, width float64) (float64, float64) {  
    var area = length * width
    var perimeter = (length + width) * 2
    return area, perimeter
}

func main() {  
    area, _ := rectProps(10.8, 5.6) // 返回值周長被丟棄
    fmt.Printf("Area %f ", area)
}

運行這個程序class

在程序的 area, _ := rectProps(10.8, 5.6) 這一行,咱們看到空白符 _ 用來跳過不要的計算結果。

『GCTT 出品』Go 系列教程 —— 6. 函數(Function)
refer:
相關文章
相關標籤/搜索