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

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

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如若转载,请注明出处:http://www.pswp.cn/news/909941.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/news/909941.shtml
    英文地址,请注明出处:http://en.pswp.cn/news/909941.shtml

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    什么是池化

    池化是深度学习中用于降低数据维度、提取核心特征的一种操作,主要应用于卷积神经网络(CNN)。其核心思想是通过对局部区域进行聚合统计(如取最大值、平均值),保留关键信息的同时减少计算量。 池化的作用 降维…

    C++ 性能分析工具:Valgrind 与 perf

    在 C 开发中,性能优化是提升软件质量的关键环节。内存泄漏和 CPU 资源消耗是最常见的性能瓶颈,而 Valgrind 和 perf 作为专业的性能分析工具,能帮助开发者精准定位这些问题。下面将从工具原理、使用方法、实战案例等方面进行详细介绍。 一、…

    ABP VNext + MongoDB 数据存储:多模型支持与 NoSQL 扩展

    🚀 ABP VNext MongoDB 数据存储:多模型支持与 NoSQL 扩展(生产级实践) 目录 🚀 ABP VNext MongoDB 数据存储:多模型支持与 NoSQL 扩展(生产级实践)🎯 引言&#x1f9f0…

    Cursor Rules 的核心定位与作用 DevOps是

    Cursor Rules 是 AI 编程工具 Cursor IDE 中的核心功能,用于约束 AI 生成代码的行为,确保其符合项目规范、编码风格或特定技术需求。它本质上是一套持久化、可复用的指令集,会动态插入到 AI 模型的上下文提示中,指导其生成代码的逻…

    Qt事件处理机制

    事件的概念 在Qt中,以事件驱动UI工具集,包括信号和槽都依赖于Qt的事件处理机制。通常事件是由窗口系统或Qt自身产生的,用以响应所发生的各类事情。如:用户按下并释放键盘或鼠标、窗口缩放后重绘、定时器到时等。如下图&#xff1…

    【慧游鲁博】【11】小程序端·游览画卷修改·支持图片url格式·结合图床上传和加载·数据对接

    文章目录 需求修改细节前端主要修改点说明:前端传递格式 后端ArtifactItem 类:ScrollServiceImpl 类:修改 InfoPanel 结构重构 ScrollHorizontalRollComposer修改后的 ScrollHorizontalRollComposer移除冗余代码修改总结 数据流图片格式兼容性…

    攻克SQL审核“最后堡垒”!PawSQL首发T-SQL存储过程深度优化引擎

    为什么存储过程审核那么难? 存储过程将数据操作逻辑固化在数据库层,一次编译、多次执行,既能大幅提升性能,也能通过权限隔离增强安全。然而,正因其逻辑复杂、分支众多,存储过程内部的 SQL 审核与优化常常成…

    计算机网络零基础完全指南

    目录 🌐 什么是计算机网络 生活中的类比 计算机网络的本质 网络的发展历程 🏠 网络IP详解(重点) 1. IP地址是什么? 生活例子:IP地址就像门牌号 IP地址的格式 IP地址的二进制表示 2. IP地址的分类详解 A类地址(大型网络) B类地址(中型网络) C类地址(小…

    DL___线性神经网络

    1)回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。 2)一般回归是和预测有关,比如预测价格(房屋,…

    WSL2安装与使用(USB、GPU、虚拟机、图形界面)

    文章目录 前言WSL2安装(手动安装)WSL2基础使用VS Code与WSL2配合使用连接USB设备WSL2中使用GPU(RTX5060Ti 16G)与虚拟机兼容使用(Virtual Box)图形与桌面环境WSL消失(灾难性故障)问题…

    uni-app项目实战笔记16--实现头部导航栏效果

    先来看效果&#xff1a; 要求&#xff1a;顶部导航栏要始终固定在上方&#xff0c;不随页面上下拖动而消失。 代码实现&#xff1a; 1.定义一个自定义导航栏组件&#xff1a;custom-nav-bar.vue&#xff0c;并写入如下代码&#xff1a; <template><view class"…

    web3.js 核心包及子模块

    . 核心包 (web3) 功能:提供基础连接、工具函数和核心功能。 包含子模块: web3.eth - 以太坊区块链交互 web3.utils - 辅助工具函数 web3.shh - Whisper 协议(已废弃) web3.bzz - Swarm 去中心化存储(已废弃) web3.net - 网络相关功能 web3.contract - 智能合约交互 web3.…

    训练检测之前的视频抽帧

    接下来安装pytorch Previous PyTorch Versions 视频抽帧 import cv2def extract_frames(video_path, output_folder, frame_rate1):"""从视频中抽取帧。:param video_path: 视频文件的路径:param output_folder: 存储帧的文件夹路径:param frame_rate: 抽取的…

    智能家居HA篇 二、配置Home Assistant并实现外部访问

    智能家居HA篇 一、Win10 VM虚拟机安装 Home Assistant 手把手教学 二、通过Cpolar配置Home Assistant并实现外部访问 文章目录 智能家居HA篇前言一、内网穿透工具&#xff08;cpolar&#xff09;二、映射HA端口1.访问cpolar仪表2.创建账号并登录3.创建隧道 三、HA设置及公网访…

    day09——Java基础项目(ATM系统)

    文章目录 Java项目实战&#xff1a;手把手开发ATM银行系统&#xff08;附完整源码&#xff09;一、系统架构设计1. 三层架构模型2. 核心数据结构 二、核心功能实现1. 开户功能&#xff08;含唯一卡号生成&#xff09;2. 登录安全验证3. 存取款业务4. 安全转账实现 三、账户安全…

    计算机网络:(五)信道复用技术,数字传输系统,宽带接入技术

    计算机网络&#xff1a;&#xff08;五&#xff09;信道复用技术&#xff0c;数字传输系统&#xff0c;宽带接入技术 前言一、信道复用技术1. 为什么需要复用技术&#xff1f;2. 频分复用&#xff08;FDM&#xff09;3. 时分复用&#xff08;TDM&#xff09;4. 统计时分复用&am…

    【期末总结】计算机网络

    【期末总结】计算机网络 参考链接&#xff1a;计算机网络知识点全面总结&#xff08;有这一篇就够了&#xff01;&#xff01;&#xff01;&#xff09;-CSDN博客 一.概述 1.1 计算机网络的分类 按照网络的作用范围&#xff1a;广域网&#xff08;WAN&#xff09;、城域网&a…

    React学习001-创建 React 应用

    React学习001-创建 React 应用 1、安装node.js2、安装构建工具2.1 核心特性2.2 性能对比​​2.3 适用场景​​ 3、创建应用4、项目启动参考文章 1、安装node.js 这里建议安装nvm多版本管理node.js&#xff0c;想用哪个版本&#xff0c;一条命令即可~ 多版本管理node.js 2、安…

    (cvpr2025) Adaptive Rectangular Convolution for Remote Sensing Pansharpening

    论文&#xff1a;(cvpr2025) Adaptive Rectangular Convolution for Remote Sensing Pansharpening 代码&#xff1a;https://github.com/WangXueyang-uestc/ARConv.git 这个论文研究的是全色与多光谱图像的融合。作者认为现有的基于CNN的方法中&#xff0c;传统的卷积存在两个…

    【图像处理入门】7. 特征描述子:从LBP到HOG的特征提取之道

    摘要 特征描述子是图像处理中提取图像本质信息的关键工具。本文将深入讲解局部二值模式(LBP)与方向梯度直方图(HOG)两种经典特征描述子的原理、实现方法及应用场景。结合OpenCV代码示例,展示如何利用LBP提取纹理特征、使用HOG进行目标检测,帮助读者掌握从图像中提取有效…