1. 程式人生 > >golang基礎-函式是變數、自定義type、命名返回值、可變參、defer、匿名

golang基礎-函式是變數、自定義type、命名返回值、可變參、defer、匿名

函式是一個變數型別

package main

import("fmt"

)

func main() {
        c := add
        fmt.Println(c)

        sum := c(10, 20)
        fmt.Println(sum)
}


func add(a, b int) int {
    return a + b
}

輸出如下:

0x488a00
30

自定義一個type型別函式model

package main

import("fmt"

)
//定義一個type型別,func(int,int) int 構造一種方法的模型
type methodModel func(int,int) int func add(a int ,b int) int { return a+b } //接受一個類似methodModel方法的具體方法 func operator(entity methodModel,a int,b int)int{ return entity(a,b) } func main() { var a int = 1 var b int = 2 c:= add sum := operator(c,a,b) fmt.Printf("%d\n"
,sum) }

輸出3

命名返回值、忽略返回值

1、值傳遞
2、引用傳遞
注意1:無論是值傳遞,還是引用傳遞,傳遞給函式的都是變數的副本
不過,值傳遞是值的拷貝。引用傳遞是地址的拷貝
map、slice、chan、指標、interface預設以引用的方式傳遞

package main

import("fmt"

)

func add(a, b int) (c int) {
    c = a + b
    return
}


func calc(a, b int) (sum int, avg int) {
    sum = a + b
    avg = (a
+b)/2 return } func main() { var a int = 1 var b int = 2 c := add(a,b) fmt.Println(c) sum,_ := calc(a,b) fmt.Println(sum) sum1,avg1 := calc(a,b) `` mt.Println(sum1,avg1) }

輸出如下:

3
3
3 1

可變引數

package main

import("fmt"

)

func add(a int,args ... int)(result int) {
    result = a
    for i:=0;i<len(args);i++{
        result += args[i]
    }
    return
}

func main() {
    sum := add(1,2,3)
    fmt.Print(sum)

}

輸出如下:6

defer用途

  1. 當函式返回時,執行defer語句。因此,可以用來做資源清理
  2. 多個defer語句,按先進後出的方式執行
  3. defer語句中的變數,在defer宣告時就決定了
package main

import("fmt"

)

func add(a int,b int) int{
    defer fmt.Println("defer method")
    return a + b
}

func main() {
    defer fmt.Println("defer main1")
    defer fmt.Println("defer main2")
    sum := add(1,2)
    fmt.Print(sum,"\n")

    defer fmt.Println("defer method after")

}

輸出如下:

defer method
3
defer method after
defer main2
defer main1

匿名函式

package main

import("fmt"

)

//匿名函式1
var (
    result = func(a int,b int) int{
        return a + b
    }
)

//非匿名函式
func sum1(a int,b int)int {
    return a + b
}

//匿名函式2
func sum2(a int ,b int) int {
    tempMethod := func(a int ,b int) int {
        return a + b
    } 
        return tempMethod(a,b)
}



func sum3(a int ,b int ) int {
    resultTemp := func(a int ,b int )int {
        return a + b
    }(a,b)
    return resultTemp
}

func main() {

    sum := result(1,2)
    fmt.Println(sum)

    method:=sum1
    fmt.Println(method(3,4))

    fmt.Println(sum2(4,6))

    fmt.Println(sum3(7,9))
}

輸出如下:

3
7
10
16