C函数基础.go

前言: 在Go语言中,函数是构成程序的基本模块,它封装了一段具有特定功能的代码,使得代码更易读,更易维护和重用。熟练掌握函数的定义、调用以及相关特性是成为Go语言开发者的必经之路。

目录

[函数定义:给代码找个 "活儿的由头"](#函数定义:给代码找个 “活儿的由头”)

函数调用:使唤函数干活儿

[参数传递:给函数 "送礼物"](#参数传递:给函数 “送礼物”)

[值传递:给函数 "拍个照"](#值传递:给函数 “拍个照”)

[指针传递:给函数 "钥匙"](#指针传递:给函数 “钥匙”)

[多值传递与可变参数:给函数 "大礼包"](#多值传递与可变参数:给函数 “大礼包”)

[匿名函数与闭包:函数界的 "临时工" 和 "特工"](#匿名函数与闭包:函数界的 “临时工” 和 “特工”)

匿名函数:无名的干活儿的

[闭包:偷偷藏变量的 "特工"](#闭包:偷偷藏变量的 “特工”)

[函数作为值:函数的 "分身术"](#函数作为值:函数的 “分身术”)

[传递函数:让函数 "打工"](#传递函数:让函数 “打工”)

[返回函数:函数的 "魔法盒子"](#返回函数:函数的 “魔法盒子”)

总结

[函数是编程的 "百宝箱"](#函数是编程的 “百宝箱”)


函数定义:给代码找个 "活儿的由头"

写代码的时候,是不是总觉得重复的操作太多,看着就心烦?函数这就派上用场了,把它定义好,以后想用哪儿直接喊它就行。

定义函数就像给代码立了个 "flag",告诉它 "要是有这情况,你就按我说的干"。先瞅瞅这基本样子:

Go 复制代码
func 我叫啥(给我啥)(还你啥){
    // 我干啥
}
  • 我叫啥 :这就是函数的名字,得叫得响亮又明确,比如叫 煮泡面,一听就知道是干啥的。

  • 给我啥 :参数嘛,就是函数干活儿的原材料。比如 (泡面种类 string, 调料包数 int),意思是我给你泡面和调料包的数量。

  • 还你啥 :干完活儿给你的成果,返回值。比如 (好吃的泡面 string),给你一碗热乎的泡面。

咱整个活儿,定义个 "吹牛" 函数,看这操作:

Go 复制代码
func 我吹牛(身份 string,干啥 string) (牛皮 string) {
    牛皮 = 身份 + " 我昨天 " + 干啥 + " 可厉害了,那场面,绝了!"
    return
}

调用一下,看这效果:

Go 复制代码
fmt.Println(我吹牛("编程大神", "写代码")) 
// 输出:"编程大神 我昨天写代码可厉害了,那场面,绝了!"

有了这个函数,以后吹牛都不用费脑子了,直接套模板,是不是绝了?

函数调用:使唤函数干活儿

写好函数不调用,那不就白写了?调用函数就像使唤小弟一样,你喊一声,它就屁颠屁颠来干活儿。

简单调用:

Go 复制代码
我吹牛("健身达人", "举铁")

要是函数能给你多个结果,你就用多个变量接:

Go 复制代码
func 我给信息() (名字 string, 年龄 int) {
    return "张三", 25
}

他的名字, 他的年龄 := 我给信息()
fmt.Printf("%s 今年 %d 岁。", 他的名字, 他的年龄)
// 输出:"张三 今年 25 岁。"

要是有些返回值不想要,咱就用 _ 来打发它:

Go 复制代码
_, 他的年龄 := 我给信息()
fmt.Printf("年龄:%d", 他的年龄) // 输出:"年龄:25"

这不就得了,想干啥干啥,函数听话得很!

参数传递:给函数 "送礼物"

参数传递就是给函数送东西,让它用这些东西干活儿。送的方式不一样,效果也不同。

值传递:给函数 "拍个照"

值传递就是给函数一张参数的 "照片",函数咋折腾这张照片,原参数都跟它没关系。

Go 复制代码
func 我试试改(x int) {
    x = 100
}

a := 10
我试试改(a)
fmt.Println(a) // 输出:10,a 一点事没有

这就跟给朋友照片让他随便画一样,原照片还是好好的。

指针传递:给函数 "钥匙"

指针传递就是把参数的 "钥匙" 给函数,函数直接去你家改东西。

Go 复制代码
func 我真的改(a *int) {
    *a = 100
}

a := 10
我真的改(&a)
fmt.Println(a) // 输出:100,a 被改了

这就跟把钥匙给朋友让他直接进你家改东西一样,改完你就懵了。

多值传递与可变参数:给函数 "大礼包"

有时候要给函数送一堆参数,Go 允许我们用 ... 给它送 "大礼包"。

Go 复制代码
func 求和(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

fmt.Println(求和(1, 2, 3, 4, 5)) // 输出:15

这就跟给朋友送一箱零食,让他一颗一颗吃,最后算总数。

匿名函数与闭包:函数界的 "临时工" 和 "特工"

匿名函数:无名的干活儿的

匿名函数没名字,就像临时工,用完就走,可干活儿利索得很。

Go 复制代码
func() {
    fmt.Println("我是个无名小卒,但能干活儿!")
}()

// 输出:"我是个无名小卒,但能干活儿!"

咱也可以把它存起来,想啥时候用就啥时候用:

Go 复制代码
做饭 := func() {
    fmt.Println("我在做饭!")
}
做饭() // 输出:"我在做饭!"

闭包:偷偷藏变量的 "特工"

闭包就是匿名函数偷偷藏了一个变量,像特工一样,带着这个变量到处跑。

Go 复制代码
func 计数器() func() int {
    count := 0
    return func() int {
        count++ // 偷偷改 count
        return count
    }
}

计数 := 计数器()
fmt.Println(计数()) // 输出:1
fmt.Println(计数()) // 输出:2

这就像有个小本子,每次调用函数就偷偷在小本子上记一笔,下次还能接着记。

函数作为值:函数的 "分身术"

在 Go 里,函数可以像玩具一样被传来传去,还能变出新花样。

传递函数:让函数 "打工"

Go 复制代码
func 干点啥(干啥 func()) {
    fmt.Println("我要开始啦!")
    干啥()
    fmt.Println("干完啦!")
}

做饭 := func() {
    fmt.Println("做饭中......")
}
干点啥(做饭)

// 输出:
/*
我要开始啦!
做饭中......
干完啦!
*/

这就跟让做饭函数去干点啥函数那 "打一天工",干点啥就是 "工头"。

返回函数:函数的 "魔法盒子"

Go 复制代码
func GetGreeter(name string) func() {
    return func() {
        fmt.Printf("你好呀,%s!\n", name)
    }
}

greeter := GetGreeter("小明")
greeter() // 输出:"你好呀,小明!"

这就跟打开一个 "魔法盒子",每次打开都根据名字变出不同的问候。

总结

函数是编程的 "百宝箱"

宝子们,Go 语言的函数就是个 "百宝箱",你想让它干啥都能干。从定义、调用到那些奇奇怪怪的参数传递,再到匿名函数、闭包、函数作为值这些 "高端操作",只要掌握了,你写代码就跟玩积木一样,咋搭都好看,还超实用!

以后写代码,多让函数 "整活儿",把复杂的事儿交给它,简单的事儿也交给它,反正啥事儿都能交给它!编程其实就是这么简单又好玩,冲就完事儿!

相关推荐
brzhang7 分钟前
Kotlin Multiplatform (KMP) vs. Flutter:谁才是下一代跨平台开发的真正王者?
前端·后端·架构
大明者省23 分钟前
pycharm2020.2版本给项目选择了虚拟环境解释器,项目文件都运行正常,为什么terminal文件路径的前面没有虚拟解释器的名称
开发语言·python
Java中文社群30 分钟前
ChatClient vs ChatModel:开发者必须知道的4大区别!
java·人工智能·后端
bobz96540 分钟前
nodejs 简单了解
后端
bobz96542 分钟前
想用 nodejs 启动一个 web 服务,但是遇到了 python2 的问题
后端
强哥叨逼叨1 小时前
Postgres 杀疯了,堪称 “六边形战士”,还要 Redis 干啥?
后端
岸边的风1 小时前
JavaScript篇:【前端必备】数组方法大全:从‘会写’到‘玩出花’,你掌握几个?
开发语言·前端·javascript
写bug写bug1 小时前
Spring Cloud中的@LoadBalanced注解实现原理
java·后端·spring cloud
十月不到底1 小时前
在 Tomcat 中通过 web.xml 配置缓存控制响应头
后端
HoroMin1 小时前
在Spring Boot中自定义JSON返回日期格式的指南
java·开发语言·spring boot·注解