func 函數名 (參數列表) [(返回值列表)] {}
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) }
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) }
// 寫一個函數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) }
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() //其餘操做 }