Golang - 函數

Golang - 函數

1. 自定義函數

函數聲明格式ide

func 函數名( [參數列表] ) [返回值類型列表] {
   函數體
}

全部類型函數

//package 聲明開頭表示代碼所屬包
package main

import "fmt"


//無參無返回值
func test01(){
    fmt.Println("三無產品")
}


//有參無返回值
func test02(v1 int, v2 int){
    fmt.Println(v1, v2)
}

func test022(v1, v2 int)  {
    fmt.Println(v1, v2)
}


//有不定參數無返回值
func test03(args ...int){
    //遍歷
    for _,n := range  args{
        fmt.Println(n)
    }
}

func main() {
    test03(1, 2, 3)
}


//無參有返回值
func test04()(a int, str string){
    a = 666
    str = "沙雕"
    return
}


//有參有返回值
func test05(num1 int, num2 int)(min int, max int){
    if num1 > num2{
        min = num2
        max = num1
    }else{
        max = num2
        min = num1
    }
    return
}

練習: 分別經過循環和遞歸函數,計算1+2+3……+100code

//package 聲明開頭表示代碼所屬包
package main

import "fmt"

//第一種
func test011() int {
    i := 1
    sum := 0
    for i = 1; i <= 100; i++ {
        sum += i
    }
    return sum
}

//第二種
func test012(num int) int {
    if num == 1 {
        return 1
    }
    return num + test012(num-1)
}
func main() {
    //fmt.Println(test011())
    fmt.Println(test012(100))
}

2. defer關鍵字

  • d- efer用於延遲一個函數或者方法的執行
  • defer語句常常被用於處理成對的操做,如打開、關閉、鏈接、斷開鏈接、加鎖、釋放鎖
  • 經過defer機制,不論函數邏輯多複雜,都能保證在任何執行路徑下,資源被釋放
  • 釋放資源的defer應該直接跟在請求資源的語句後,以避免忘記釋放資源遞歸

    //package 聲明開頭表示代碼所屬包
    package main
    
    import "fmt"
    
    func main() {
        defer fmt.Println("defer語句")
        fmt.Println("打醬油")
    }
    
    //打醬油
    //defer語句

3. 多個defer執行順序

//package 聲明開頭表示代碼所屬包
package main

import "fmt"

func test99(x int){
    fmt.Println(100 / x)
}

func main() {
    defer fmt.Println("1號門")
    defer fmt.Println("2號門")
    test99(0)
    defer fmt.Println("3號門")
}


//2號門
//1號門
//panic: runtime error: integer divide by zero
//
//goroutine 1 [running]:
//main.test99(0x0)
//D:/awesomeProject/first.go:7 +0xb3
//main.main()
//D:/awesomeProject/first.go:13 +0xed
相關文章
相關標籤/搜索