Go開發之路 -- 函數詳解

聲明語法

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

 

Golang函數特色

a. 不支持重載,一個包不能有兩個名字同樣的函數
b. 函數是一等公民,函數也是一種類型,一個函數能夠賦值給變量
c. 匿名函數
d. 多返回值

 

函數的參數傳遞方式

值傳遞

引用傳遞

注意1:
不管是值傳遞,仍是引用傳遞,傳遞給函數的都是變量的副本, 不過,值傳遞是值的拷貝。引用傳遞是地址的拷貝,通常來講,地址 拷貝更爲高效。而值拷貝取決於拷貝的對象大小,對象越大,則性能 越低。
注意2:
map、slice、chan、指針、interface默認以引用的方式傳遞

 

/*
package main

import "fmt"

func modify(a int) {
    a = 100
}

func main(){
    a := 8
    fmt.Println(a)
    modify(a)
    fmt.Println(a)
}
*/
// 修改上面的程序, 使其正確

package main

import "fmt"

func modify(a *int) {
    *a = 100
}

func main(){
    a := 8
    fmt.Println(a)
    modify(&a)
    fmt.Println(a)
}
練習 13

 

命名返回值的名字

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() {
      sum, _ := calc(100, 200)
}

 

可變參數

func add(arg…int) int {    // 0個或多個參數

}
func add(i int, arg…int) int {    // 1個或多個參數

}
func add(i int, j int, arg…int) int {    // 2個或多個參數

}
注意:
其中arg是一個slice,咱們能夠經過arg[index]依次訪問全部參數
經過len(arg)來判斷傳遞參數的個數

 

// 寫一個函數add, 支持一個或多個int相加, 並返回相加結果

package main

import "fmt"

func add(x int, arg...int) int{
    var sum int = x
    for i := 0; i < len(arg); i++ {
        sum += arg[i]
    }
    return sum
}

func main(){
    res := add(2, 2)
    fmt.Println(res)
}
練習14

 

// 寫一個函數concat, 支持一個或者多個string相拼接, 並返回結果

package main

import "fmt"

func concat(str string, arg...string)(res string){
    res = str
    for i := 0; i < len(arg); i++ {
        res += arg[i]
    }
    return
}

func main(){
    res := concat("plm", "asd")
    fmt.Println(res)
}
練習 15

 

defer的用途

1. 當函數返回時,執行defer語句。所以,能夠用來作資源清理
2. 多個defer語句,按 先進後出 的方式執行
3. defer語句中的變量,在defer聲明時就決定了

應用:數據庫

    1. 關閉文件句柄ide

func read(){
    file := open(filename)
    defer file.Close()

    //文件操做

}

    2. 鎖資源釋放函數

func read() {
    mc.Lock()
    defer mc.Unlock()
    //其餘操做
}

    3. 數據庫鏈接釋放性能

func read() {
    conn := openDatabase()
    defer conn.Close()
    //其餘操做
}
相關文章
相關標籤/搜索