前言: 在Go語言中,函數是構成程序的基本模塊,它封裝了一段具有特定功能的代碼,使得代碼更易讀,更易維護和重用。熟練掌握函數的定義、調用以及相關特性是成為Go語言開發者的必經之路。
目錄
函數定義:給代碼找個 “活兒的由頭”
函數調用:使喚函數干活兒
參數傳遞:給函數 “送禮物”
值傳遞:給函數 “拍個照”
指針傳遞:給函數 “鑰匙”
多值傳遞與可變參數:給函數 “大禮包”
匿名函數與閉包:函數界的 “臨時工” 和 “特工”
匿名函數:無名的干活兒的
閉包:偷偷藏變量的 “特工”
函數作為值:函數的 “分身術”
傳遞函數:讓函數 “打工”
返回函數:函數的 “魔法盒子”
總結
函數是編程的 “百寶箱”
函數定義:給代碼找個 “活兒的由頭”
寫代碼的時候,是不是總覺得重復的操作太多,看著就心煩?函數這就派上用場了,把它定義好,以后想用哪兒直接喊它就行。
定義函數就像給代碼立了個 “flag”,告訴它 “要是有這情況,你就按我說的干”。先瞅瞅這基本樣子:
func 我叫啥(給我啥)(還你啥){// 我干啥
}
-
我叫啥:這就是函數的名字,得叫得響亮又明確,比如叫
煮泡面
,一聽就知道是干啥的。 -
給我啥:參數嘛,就是函數干活兒的原材料。比如
(泡面種類 string, 調料包數 int)
,意思是我給你泡面和調料包的數量。 -
還你啥:干完活兒給你的成果,返回值。比如
(好吃的泡面 string)
,給你一碗熱乎的泡面。
咱整個活兒,定義個 “吹牛” 函數,看這操作:
func 我吹牛(身份 string,干啥 string) (牛皮 string) {牛皮 = 身份 + " 我昨天 " + 干啥 + " 可厲害了,那場面,絕了!"return
}
?調用一下,看這效果:
fmt.Println(我吹牛("編程大神", "寫代碼"))
// 輸出:"編程大神 我昨天寫代碼可厲害了,那場面,絕了!"
有了這個函數,以后吹牛都不用費腦子了,直接套模板,是不是絕了?
函數調用:使喚函數干活兒
寫好函數不調用,那不就白寫了?調用函數就像使喚小弟一樣,你喊一聲,它就屁顛屁顛來干活兒。
簡單調用:
我吹牛("健身達人", "舉鐵")
要是函數能給你多個結果,你就用多個變量接:
func 我給信息() (名字 string, 年齡 int) {return "張三", 25
}他的名字, 他的年齡 := 我給信息()
fmt.Printf("%s 今年 %d 歲。", 他的名字, 他的年齡)
// 輸出:"張三 今年 25 歲。"
?要是有些返回值不想要,咱就用 _ 來打發它:
_, 他的年齡 := 我給信息()
fmt.Printf("年齡:%d", 他的年齡) // 輸出:"年齡:25"
這不就得了,想干啥干啥,函數聽話得很!
參數傳遞:給函數 “送禮物”
參數傳遞就是給函數送東西,讓它用這些東西干活兒。送的方式不一樣,效果也不同。
值傳遞:給函數 “拍個照”
值傳遞就是給函數一張參數的 “照片”,函數咋折騰這張照片,原參數都跟它沒關系。
func 我試試改(x int) {x = 100
}a := 10
我試試改(a)
fmt.Println(a) // 輸出:10,a 一點事沒有
這就跟給朋友照片讓他隨便畫一樣,原照片還是好好的。
指針傳遞:給函數 “鑰匙”
指針傳遞就是把參數的 “鑰匙” 給函數,函數直接去你家改東西。
func 我真的改(a *int) {*a = 100
}a := 10
我真的改(&a)
fmt.Println(a) // 輸出:100,a 被改了
這就跟把鑰匙給朋友讓他直接進你家改東西一樣,改完你就懵了。
多值傳遞與可變參數:給函數 “大禮包”
有時候要給函數送一堆參數,Go 允許我們用 ...
給它送 “大禮包”。
func 求和(nums ...int) int {total := 0for _, num := range nums {total += num}return total
}fmt.Println(求和(1, 2, 3, 4, 5)) // 輸出:15
這就跟給朋友送一箱零食,讓他一顆一顆吃,最后算總數。
匿名函數與閉包:函數界的 “臨時工” 和 “特工”
匿名函數:無名的干活兒的
匿名函數沒名字,就像臨時工,用完就走,可干活兒利索得很。
func() {fmt.Println("我是個無名小卒,但能干活兒!")
}()// 輸出:"我是個無名小卒,但能干活兒!"
咱也可以把它存起來,想啥時候用就啥時候用:?
做飯 := func() {fmt.Println("我在做飯!")
}
做飯() // 輸出:"我在做飯!"
閉包:偷偷藏變量的 “特工”
閉包就是匿名函數偷偷藏了一個變量,像特工一樣,帶著這個變量到處跑。
func 計數器() func() int {count := 0return func() int {count++ // 偷偷改 countreturn count}
}計數 := 計數器()
fmt.Println(計數()) // 輸出:1
fmt.Println(計數()) // 輸出:2
這就像有個小本子,每次調用函數就偷偷在小本子上記一筆,下次還能接著記。
函數作為值:函數的 “分身術”
在 Go 里,函數可以像玩具一樣被傳來傳去,還能變出新花樣。
傳遞函數:讓函數 “打工”
func 干點啥(干啥 func()) {fmt.Println("我要開始啦!")干啥()fmt.Println("干完啦!")
}做飯 := func() {fmt.Println("做飯中……")
}
干點啥(做飯)// 輸出:
/*
我要開始啦!
做飯中……
干完啦!
*/
這就跟讓做飯函數去干點啥函數那 “打一天工”,干點啥就是 “工頭”。
返回函數:函數的 “魔法盒子”
func GetGreeter(name string) func() {return func() {fmt.Printf("你好呀,%s!\n", name)}
}greeter := GetGreeter("小明")
greeter() // 輸出:"你好呀,小明!"
這就跟打開一個 “魔法盒子”,每次打開都根據名字變出不同的問候。
總結
函數是編程的 “百寶箱”
寶子們,Go 語言的函數就是個 “百寶箱”,你想讓它干啥都能干。從定義、調用到那些奇奇怪怪的參數傳遞,再到匿名函數、閉包、函數作為值這些 “高端操作”,只要掌握了,你寫代碼就跟玩積木一樣,咋搭都好看,還超實用!
以后寫代碼,多讓函數 “整活兒”,把復雜的事兒交給它,簡單的事兒也交給它,反正啥事兒都能交給它!編程其實就是這么簡單又好玩,沖就完事兒!