Go 語言學習之函數

山不在高,有仙則名
水不在深,有龍則靈

函數

函數可以說是所有程序的核心,不同的語言之間,函數的定義也不盡相同,大同小異,下面就Go的函數做個簡單記錄

定義
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) {
        //這里是處理邏輯代碼
        //返回多個值
        return value1, value2
    }

下面看看在c語言中和Objective-C中的定義方式

c語言定義方式
type funcName(type1 input1,type2 input2)
Objective-C定義方式
- (type)funcName:(type1 )input1 param:(type2)input2

從上面我們可以看出,其實在函數的定義上,基本上都是一樣的,都由返回類型函數名入參 組成,但是在go中有個比較特殊的就是返回值,居然可以有多個返回值,是讓我挺驚訝的,在Objective-C中,如果需要返回多個返回值,可以返回一個數組,用數組來裝這多個返回值。

下面來看看go中函數的簡單使用

一般函數

//函數測試
func moreReturnFunc(a int,b int)(c int,d int)  {
    c = a*b
    d = a/b
    return c,d;
}

//返回數組
func arrayReturnFunc(a int,b int)([]int)  {
    c := a+b;
    d := a-b;
    e := []int{c,d}
    return e;
}

//無返回值
func noReturn(width float64,height float64)  {
    area := width * height
    println(area)
}

go中,函數的定義可以有返回值也可也沒有返回值,在多返回值函數中,返回的時候可以不用帶上變量名,如下面這樣

//不帶返回值
func moreReturnFunc(a int,b int)(int,int)  {
    return a*b, a/b
}

當然在程序中,還是建議寫上參數,這樣方便理解和使用

可變參數

顧名思義,就是有著不定數量的參數的函數,下面我們來看看定義

func funcName(arg ...int) {}

看看使用方法

//可變參數

func sum(num ...int)  {
    fmt.Println(num)
    total := 0
    for _,value := range num{

        total += value
    }
    fmt.Println(total)
}

//主函數
func main() {

    //多返回值
    mm,bb := moreReturnFunc(20,5)

    fmt.Println(mm,bb)//輸出結果 100 4

    //返回數組函數調用
    fmt.Println(arrayReturnFunc(50,5)[0],arrayReturnFunc(50,5)[1])//輸出結果55 45


    //多個參數
    sum(1,2,3,4)//輸出結果[1 2 3 4]    10

    //如果參數在數組里,需要加...
    sum([]int{1,2,3,4,5}...)//輸出結果[1 2 3 4 5]    15
}

大概使用過程就這樣

傳指針

關于傳指針這個問題,其實就是我們需不需要讓入參的值發生變化,在c語言或者是Objective-C中如果入參為intfloat等,那么當我們在函數中對入參進行修改時,實際上是傳了這個值的一份copy,當在被調用函數中修改參數值的時候,調用函數中相應實參不會發生任何變化,因為數值變化只作用在copy上。怎么說了,大概就是這樣的

//主函數
func main() {
    plusA := 10
    plusB := 5
    fmt.Println(plus(&plusA,&plusB),plusA)

}

func plus(a *int,b *int) int {
    *a = *a - *b
    return *a
}

//輸出結果為:5   5這里由于傳了指針,當*a = *a-*b的時候,改變的同一地址也就是plusA的值,所以當我們輸出plusA的時候,值也就改變了

可以看看不傳指針的情況

//主函數
func main() {
    plusA := 10
    plusB := 5
    fmt.Println(plus(plusA,plusB),plusA)

}

func plus(a int,b int) int {
    a = a - b
    return a
}

輸出結果為 :5    10

注意上面傳指針的時候,在調用函數的時候需要添加&符號,傳指針的方法和在Objective-C中參數是對象差不多,當然前提是不是copy屬性

函數作為參數類型

將函數作為參數類型之前,我們首先需要將函數定義一個類型,定義方式為

type typeName func (inputType) outType

其實就是將函數的原型定義成一個類型
可以看看具體使用,就對上面的函數進行改造添加幾個函數測試

//主函數
func main() {
    plusA := 10
    plusB := 5
    fmt.Println(plus(plusA,plusB,sum,moreReturnFunc),plusA)

}

//定義類型
type moreParatest func (arg...int) int

type moreReturnParatest func (int,int) (int,int)

func plus(a int,b int,c moreParatest,d moreReturnParatest) int {
    n,m:=moreReturnFunc(4,2)
    a = a - b + c(1,2,3,4,5) + n + m
    return a
}

func sum(num ...int)  int {
    fmt.Println(num)
    total := 0
    for _,value := range num{

        total += value
    }
    fmt.Println(total)
    return total
}

func moreReturnFunc(a int,b int)(c int,d int)  {
    c = a*b
    d = a/b
    return c,d;
}

在上面的例子中,我先定義了兩個類型的函數--moreParatestmoreReturnParatest,這兩個函數一個是傳入多個參數返回int,一個是傳入兩個int然后返回兩個int返回值的函數,在plus函數中,將類型直接作為參數傳入函數中,這樣我們的參數cd就相當于兩個函數,在plus函數中,我們在調用他們,具體函數實現就不去管他。
plus函數定義好之后,我們在main函數中進行調用,由于我們的sum函數和moreReturnFunc分別對應滿足定義的函數類型,所以直接將該兩個函數當作參數傳入即可
最終結果如下

30 10

通過這樣的方式,我們的程序可以變得非常靈活,特別是在封裝接口的時候

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容