Golang筆記之函數

1、函數基礎

函數用於對代碼塊的邏輯封裝,提供代碼複用的最基本方式。使用func關鍵字聲明函數,其次是函數名,形參,返回值,函數體,形參和返回值若是沒有能夠省略。使用return關鍵字返回值。數組

示例1:無參數,無返回值bash

func helloWorld() {
 fmt.Println("Hello World")
}
helloWorld()

示例2:單個形參閉包

func sayHi(user string) { 
fmt.Println("Hi", user)
}
sayHi()

示例3:多個形參(類型合併)app

多個形參類型一致可只保留最後一個類型,形參能夠不使用ide

func sayHi(stu1,stu2 string, b1 bool){
  fmt.Println("Hi",stu1)
  fmt.Println("Hi",stu2)
}
sayHi("alex","eric",false)

示例4:形參可變函數

可變參數只能定義一個,且只能在參數列表的最後,被調用時,可變參數被初始化爲對應類型的切片spa

func varArgs(args ...string){
fmt.Println(args)
}
varArgs("11","22","33") //調用可變參數
varArgs([]string{"11","22","33"}...)  //切片解包後傳遞給可變參數函數

示例5:有參數,有返回值遞歸

返回值可指定變量名,變量在調用時會根據類型使用零值進行初始化,string

func add(n1,n2 int) (sum int){
  return n1 + n2
}
sum := add(1,2)
fmt.Println(sum)
在調用 return時不須要添加返回值,go語言自動將變量的最終結果進行返回
在使用命名返回值時,當聲明函數中存在若多個連續返回值類型相同可只保,留最後一個返回值類型名
func add(n1,n2 int) (sum int){
    sum = n1 + n2
  return 
}
sum := add(1,2)
fmt.Println(sum)

示例6:多返回值it

在聲明函數時使用括號包含全部返回值類型,並使用 return關鍵字返回,值之間用逗號分割

func calc(n1,n2 int)(int,int,int,int){
  return n1 + n2, n1 - n2, n1 * n2, n1 / n2
}
sum, diff, product, quotient := calc(1,2)
fmt.Println(sum, diff, product, quotient)

2、遞歸

遞歸是指函數直接或間接調用本身,遞歸經常使用於解決分治問題,將大問題分解爲相同的小問題進行解決,須要關注終止條件。

示例:階乘

func fact(n int64) int64 {
if n == 0 || n == 1 {
    return 1
  }
  return n * fact(n-1)
}
func main() {
fmt.Println(fact(5))
}

3、函數類型

函數也能夠賦值給變量,存儲在數組、切片、映射中,也可做爲參數傳遞給函數或做爲函數返回值進行返回

3.一、定義&賦值&調用

定義函數類型的變量

var callback func(int, int) int

賦值爲函數

func add(n1,n2 int) int{
  return n1 + n2
}
callback = add

調用函數

fmt.Println(callback(1,2))


3.二、參數類型爲函數的函數

func tlAdd5(n int) int {
  return n + 5
}
func makeMap(list []int, t1 func(int) int) []int {
  rt := []int{}
  for _,e := range list {
    rt = append(rt,t1(e))
  }
  return rt
}
fmt.Println(makeMap([]int{1,2,3},tlAdd5))

4、匿名函數和閉包

4.一、匿名函數

不須要定義名字的函數叫作匿名函數,經常使用作幫助函數在局部代碼塊中使用或做爲其餘函數的參數

示例1:定義後直接賦值給變量,直接調用

add := func(n1,n2 int) int {
return n1 + n2
}(1,2)
fmt.Println(add)

示例2:參數類型爲函數的匿名函數

import (
  "fmt"
  "strconv"
)
func printResult(n1 int) string {
  return strconv.Itoa(n1)
}
func main(){
  result := printResult(func(n1,n2 int) int {
    return n1 + n2
  }(1,2))
    fmt.Printf("%T,%v\n",result,result)
}

4.二、閉包

閉包是指在函數內定義的匿名函數引用外部函數的變量,只要匿名函數繼續使用則外部函數賦值的變量不被自動銷燬

func generateId(start, step int) func() int {
  return func() int {
    id := start
    start += step
    return id
  }
}
g1 := generateId(1,2)
g5 := generateId(5,5)
fmt.Println(g1(),g5())
fmt.Println(g1(),g5())
相關文章
相關標籤/搜索