Golang基礎(chǔ)筆記八之函數(shù)
本文首發(fā)于公眾號:Hunter后端
本篇筆記介紹 Golang 里函數(shù)相關(guān)的內(nèi)容,以下是本篇筆記目錄:
- 函數(shù)的定義語法
- 函數(shù)返回值
- 可變參數(shù)函數(shù)
- 匿名函數(shù)
- 閉包
1、函數(shù)的定義語法
函數(shù)的定義格式如下:
func 函數(shù)名(參數(shù)列表) (返回值列表) { 函數(shù)體 }
比如下面是一個(gè)兩數(shù)相加返回其和的函數(shù):
func add(a, b int) int {
return a + b
}
調(diào)用的話,直接傳參調(diào)用即可:
sum := add(1, 4)
fmt.Println(sum)
傳入的參數(shù)可以傳值,也可以傳指針,如果傳指針的話,在函數(shù)內(nèi)部修改后,會影響原值。
以下是一個(gè)傳指針修改的示例:
func test(a *int, b int) {
*a += 2
b += 2
}
func main() {
a := 1
b := 1
fmt.Printf("調(diào)用前 a:%d, b:%d\n", a, b)
test(&a, b)
fmt.Printf("調(diào)用后 a:%d, b:%d\n", a, b)
}
輸出結(jié)果為:
調(diào)用前 a:1, b:1
調(diào)用后 a:3, b:1
2、函數(shù)返回值
函數(shù)返回值可以返回單個(gè)或多個(gè),在函數(shù)定義的時(shí)候指定返回類型即可:
func add(a, b int) int {
return a + b
}
func swap(a, b int) (int, int) {
return b, a
}
還可以對返回值命名,就是在定義函數(shù)的時(shí)候,將返回值提前聲明定義,然后在函數(shù)內(nèi)部對其賦值,函數(shù)末尾可以省去 return 具體變量的操作。
比如下面:
func calc(a, b int) (sum, sub int) {
sum = a + b
sub = a - b
return
}
3、可變參數(shù)函數(shù)
可變參數(shù)函數(shù)可以接受任意數(shù)量的參數(shù),在函數(shù)定義的時(shí)候,類型前面加上 ... 即表示該參數(shù)是可變參數(shù),而在函數(shù)內(nèi)部,可將其作為切片使用。
下面是一個(gè)示例,可以接受任意多個(gè)元素,作為求和函數(shù)的參數(shù):
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
調(diào)用的時(shí)候,可以直接傳入任意數(shù)量參數(shù):
sum(1, 2, 3, 4)
也可以傳入一個(gè)切片:
slice := []int{1, 2, 3}
s2 := sum(slice...)
4、匿名函數(shù)
匿名函數(shù)通常用于臨時(shí)需要處理某個(gè)功能,或需要將其作為參數(shù)傳遞給其他變量的場景。
比如下面定義并立即調(diào)用了匿名函數(shù):
total := func(a, b int) int {
return a + b
}(2, 4)
也可以將其賦值給某個(gè)變量,再由該變量來調(diào)用:
sumFunc := func(a, b int) int {
return a + b
}
sumFunc(1, 2)
5、閉包
閉包是指能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),即使該函數(shù)已經(jīng)執(zhí)行完畢,其作用域內(nèi)的變量也不會被銷毀。
我們可以使用閉包來捕獲外部函數(shù)的局部變量,并將其生命周期延長至閉包本身,比如實(shí)現(xiàn)一個(gè)計(jì)數(shù)器:
func counter() func() int {
count := 0
return func() int {
count += 1
return count
}
}
counterFunc := counter()
fmt.Println(counterFunc())
fmt.Println(counterFunc())
fmt.Println(counterFunc())
fmt.Println(counterFunc())
也可以根據(jù)外部傳入的參數(shù)生成不同的閉包實(shí)例,比如實(shí)現(xiàn)一個(gè)計(jì)算器:
func calculate(calculate_type string) func(a, b int) int {
if calculate_type == "add" {
return func(a, b int) int {
return a + b
}
} else if calculate_type == "sub" {
return func(a, b int) int {
return a - b
}
} else {
return func(a, b int) int { return a + b }
}
}
addFunc := calculate("add")
fmt.Println(addFunc(10, 5))
subFunc := calculate("sub")
fmt.Println(subFunc(3, 1))
而閉包也可以維護(hù)迭代的狀態(tài),因此可以實(shí)現(xiàn)迭代器的功能,比如實(shí)現(xiàn)一個(gè)斐波那契數(shù)列生成器:
func fibonacci() func() int {
a, b := 0, 1
return func() int {
f_count := a
a, b = b, a+b
return f_count
}
}
f := fibonacci()
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())

浙公網(wǎng)安備 33010602011771號