C函数基础.go
前言: 在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 语言的函数就是个 “百宝箱”,你想让它干啥都能干。从定义、调用到那些奇奇怪怪的参数传递,再到匿名函数、闭包、函数作为值这些 “高端操作”,只要掌握了,你写代码就跟玩积木一样,咋搭都好看,还超实用!
以后写代码,多让函数 “整活儿”,把复杂的事儿交给它,简单的事儿也交给它,反正啥事儿都能交给它!编程其实就是这么简单又好玩,冲就完事儿!