go破冰之旅·8·go函数基本实践及各种玩法
一次5-10分钟即可搞定,以干货+效率的学习方式带你更直观的玩转各种玩法!
行文不易,一字一句纯手打创造,倾注了不少精力,感谢支持。
目录
什么是函数?有哪些元素?
函数参数、返回值
小程序:函数与函数调用,各种玩法举一反三
函数参数与值传递说明
什么是函数?有哪些元素?
函数是一个基本的代码块,可以让每个函数代表一个基本职能,或者说定义要做的功能或任务;
一个完整的go程序中至少有个main函数,单个函数可声明函数名称、参数列表、返回值列表,定义函数需要用func关键字。
同时,go中的函数也是一个变量,可以在函数内继续定义函数。
其中init和main这两个内置函数的作用功能在前面讲解包时已充分说明,这里不再赘述哦!
函数参数、返回值
下面我们快速看一下函数的组成和表示:
// 示例1
func funcName(a int, b string) (string, int) {// 函数体return "",0
}【说明】
函数名称:funcName
参数列表:两个参数,分别是a、b,类型分别为int、string
返回值列表:两个返回值,类型分别为string、int,且没有定义返回值名称// 示例2
func funcName(a,b int) (sum int) {// 函数体return
}【说明】
函数名称:funcName
参数列表:两个参数,分别是a、b,类型都为int类型
返回值列表:单个返回值,定义为sum变量,为int类型
函数的参数用来做输入条件,返回值用来返回结果。
以一个常见的过程说明该模型:你要计算a+b的和,假设a+b=c,那我们这个函数要做的就是计算两数之和,返回的结果就是计算所得的和,而函数的参数就是a和b,也就是输入的条件,得告诉函数要以什么为条件让它去执行。当然。参数列表和返回值列表也都可以不设置。
小程序:函数与函数调用,各种玩法举一反三
下面写一个简单程序来认识一下函数到底怎么定义和使用。
程序完成求和、求积两个职能,下面我们根据实际含义定义两个函数:
// 两数之和
func add(a, b int) int {return a + b
}// 两数之积
func multiply(a, b int) int {return a * b
}
在main中调用并打印结果:
import "fmt"func main() {var a, b = 1, 2// 求a+b的和r1 := add(a, b)fmt.Printf("a+b= %v\n", r1)// 求a*b的积r2 := multiply(a, b)fmt.Printf("a*b= %v\n", r2)
}
这样就完成了函数调用和返回值的接收,结果:
a+b= 3
a*b= 2
另外,如果add函数我不想定义在外面,只想在本程序中唯一使用,也可以这么玩:
func main() {var a, b = 1, 2add0 := func(a, b int) int {return a + b}// 求a+b的和r1 := add0(a, b)fmt.Printf("a+b= %v\n", r1)// 求a*b的积r2 := multiply(a, b)fmt.Printf("a*b= %v\n", r2)
}// 两数之积
func multiply(a, b int) int {return a * b
}
可以看到在要求和的上方直接定义了一个函数add0,并且在接下来完成了调用,结果效果和上面完全一致。
当然,你觉得函数只有在这一个地方用到,为什么还要写函数名,让我直接调用岂不更简单?当然可以,咱们这么玩:
var a, b = 1, 2// 求a+b的和r1 := func(a, b int) int {return a + b}(a, b)fmt.Printf("a+b= %v\n", r1)
r1就是对a、b求和的结果,效果也是完全一样,注意这个示例中func后的a、b也是函数参数,实际输入的1和2这两个参数是通过函数后的小括号传进去的,这个就是实际参数,而func后的a、b是形式参数,也叫形参。
同时在这个案例中,该func就是一个匿名函数,即没有名称的函数。
函数参数与值传递说明
值得注意的是,go中主要是值传递,并没有引用传递,所谓值传递就是形式参数是对应值的一个副本,传的并不是值本身。
假设我们有这样一个需求,函数updateNum修改输入参数n的值,将值恒定改为1,分为两种,返回修改的结果、不返回修改的结果:
func updateNum (n int) int{n = 1return n // 实际这里直接return 1就行了,但为了看起来更明白因此多此一举加了n = 1
}func updateNum (n int){n = 1
}
要说明的是,返回结果这种情况只要调用方去接收函数的返回值,则接收到的必定是1,因此没有悬念,这种严格说算不上修改返回值,而是直接返回了1,下面重点看看第二种:
n := 10fmt.Printf("n=%d\n", n)updateNum(n)fmt.Printf("n=%d\n", n)
上面提到,go中默认是值传递,因此传入updateNum的参数为n的副本,函数只是传入了10而已,n本身还是n,函数内部所做的n=1实际修改的是函数的形参的值,外界的n不受影响,因此修改前后打印的n结果都是10。
那怎样才能让这个函数成功的修改了n呢?答案就是指针,给函数参数传递n的地址即可:
func main() {n := 10fmt.Printf("n=%d\n", n)updateNum(&n)fmt.Printf("n=%d\n", n)
}func updateNum(n *int) {*n = 1
}
这样修改为什么能成功,原因就是传入了n的地址,通过地址修改了变量内存地址对应的值,修改后外界会一同修改,因此在调用结束函数后再次打印,n就变成了1。这实际就是其它语言中听到的引用传递。
在后续熟悉了其它引用类型后,这会变得更加有趣!
到这里,相信你对函数的使用和玩法也有了一个清晰的认识啦。
在后续熟悉了引用类型及指针结合并逐渐加深后也可以阅读这篇(不包含在本文范畴内,目前阶段暂不必须):
关于go语言指针/指针指向的全面分析
来进一步加强这方面的全面理解。
相关文章:
go破冰之旅·8·go函数基本实践及各种玩法
一次5-10分钟即可搞定,以干货效率的学习方式带你更直观的玩转各种玩法! 行文不易,一字一句纯手打创造,倾注了不少精力,感谢支持。 目录 什么是函数?有哪些元素? 函数参数、返回值 小程序&…...
Qt - 从零到壹的 打地鼠 游戏
❤️🔥欢迎收看西北风的blog,好男人就是我,我就是西北风。✨ Gitee 地址 W_A_Mole NTC_jason/cc语言 - 码云 - 开源中国 (gitee.com) 目录 🟥一:创建一个主窗体 🟣二.:添加主窗口背景图片…...
代码自动发布系统
之前是jenkins发现gitlab代码更新了就自动获取直接部署到服务器 现在是jenkins自动获取Code之后打包成镜像上传到仓库然后通知docker去拉取更新的镜像 分析 旧∶ 代码发布环境提前准备,以主机为颗粒度静态 新: 代码发布环境多套,以容器为颗粒度编译 …...
qemu-基础篇(一)——安装
文章目录 env安装查看版本查看支持的开发板查看支持的CPU的型号 env ubuntu 安装 sudo apt-get install qemu sudo apt-get install qemu-system-arm sudo apt-get install qemu-system查看版本 qemu-img -V qemu-system-arm --version qemu-system-aarch64 --version返回结…...
从根本上理解Synchronized的加锁过程
作为一个Java开发,对于Synchronized这个关键字并不会陌生,无论是并发编程,还是与面试官对线,Synchronized可以说是必不可少。 在JDK1.6之前,都认为Synchronized是一个非常笨重的锁,就是在之前的《谈谈Java…...
CANOE入门到精通——CANOE系列教程记录1 第一个仿真工程
本系列以初学者角度记录学习CANOE,以《CANoe开发从入门到精通》参考学习,CANoe16 demo版就可以进行学习 概念 CANoe是一种用于开发、测试和分析汽车电子系统的软件工具。它通过在不同层次上模拟汽车电子系统中的不同部件,如ECU、总线和传感…...
JavaEE——单例模式
文章目录 一、介绍什么是单例模式二、饿汉模式三、懒汉模式四、讨论两种模式的线程安全问题 一、介绍什么是单例模式 在介绍单例模式之前,我们得先明确一个名词设计模式。 所谓设计模式其实不难理解,就是在计算机这个圈子中,呢些大佬们为了…...
关于数据倾斜
1、数据倾斜表现 1.1 hadoop中的数据倾斜表现 有一个多几个Reduce卡住,卡在99.99%,一直不能结束。各种container报错OOM异常的Reducer读写的数据量极大,至少远远超过其它正常的Reducer伴随着数据倾斜,会出现任务被kill等各种诡异…...
Shell第一次作业
要求: 1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查一次磁盘剩余空间。 2、判断web服务是否运行(1、查看进程的方式判断该程序是否运行,2、通过查看端口的方式判断…...
实例解读nn.AdaptiveAvgPool2d((1, 1))
nn.AdaptiveAvgPool2d((1, 1))在PyTorch中创建一个AdaptiveAvgPool2d类的实例。该类在输入张量上执行2D自适应平均池化。 自适应平均池化是一种池化操作,它计算每个输入子区域的平均值并产生一个指定大小的输出张量。子区域的大小是根据输入张量的大小和输出张量的…...
泛型编程 之模板(template)
C另一种编程思想称为 泛型编程,主要利用的技术就是模板 目录 C另一种编程思想称为 泛型编程,主要利用的技术就是模板 一、概念 二、函数模板 1、语法与使用: 2、函数模板注意事项 3、普通函数与函数模板的区别 4、普通函数与函数模板的调用规…...
用ChatGPT问DotNet的相关问题,发现DotNet工程师的前景还不错
本人最近费了九牛二虎之力注册了一个ChatGPT账号,现在就给大家分享一下,问一下关于.NET的问题,看看ChatGPT的AI功能具体如何? 一、C#跟其它语言比较的优势 回答: C#是一门编程语言,它是为 Microsoft 的 …...
LeetCode_字符串_简单_415.字符串相加
目录 1.题目2.思路3.代码实现(Java) 1.题目 给定两个字符串形式的非负整数 num1 和num2,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将…...
Insix:面向真实的生成数据增强,用于Nuclei实例分割
文章目录 InsMix: Towards Realistic Generative Data Augmentation for Nuclei Instance Segmentation摘要本文方法数据增强方法具有形态学约束的前景增强提高鲁棒性的背景扰动 实验结果 InsMix: Towards Realistic Generative Data Augmentation for Nuclei Instance Segment…...
CleanMyMac X4.13.2最新版下载
现在cleanmymac x4.13.2中文版是大家首选的优秀mac清理软件。CleanMyMac集合了多种功能,几乎可以满足用户所有的清洁需求。它不仅包含各种清理功能,还具有卸载、维护、扩展、碎纸机等实用功能,可同时替代多种工具。它可以清理、优化、维护和监…...
机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景
目录 引言 二、线性回归 三、逻辑回归 四、支持向量机 五、决策树 六、随机森林 七、K-均值聚类 八、主成分分析(PCA) 九、K近邻算法 十、朴素贝叶斯分类器 十一、神经网络 十二、AdaBoost 十三、梯度提升树(Gradient Boosting T…...
Spring Security 6.0系列【32】授权服务器篇之默认过滤器
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 本系列Spring Authorization Server 版本 1.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 前言1. OAuth2Authorizati…...
.NET中比肩System.Text.Json序列化反序列化组件MessagePack
简介 官方定义:MessagePack是一种高效的二进制序列化格式。它允许您像JSON一样在多个语言之间交换数据。但是它更快并且更小。 MessagePack是一种开源的序列化反序列化组件,可支持JAVA,C#等主流语言。在 C# 中使用 MessagePack,…...
Oracle删除列操作:逻辑删除和物理删除
概念 逻辑删除:逻辑删除并不是真正的删除,而是将表中列所对应的状态字段(status)做修改操作,实际上并未删除目标列数据或恢复这些列占用的磁盘空间。比如0是未删除,1是删除。在逻辑上数据是被删除了&#…...
找出字符串中第一个匹配项的下标、求解方程----2023/5/2
找出字符串中第一个匹配项的下标、求解方程----2023/5/2 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1…...
终极指南:如何深度探索Alerter的10个隐藏高级功能
终极指南:如何深度探索Alerter的10个隐藏高级功能 【免费下载链接】Alerter Tapadoo/Alerter: 是一个简单易用的 Android 通知和进度条控件库。适合对 Android 开发、用户界面以及想要在 Android 应用中显示通知和进度条的开发者。 项目地址: https://gitcode.com…...
终极窗口尺寸编辑器:SRWE让你的应用程序窗口自由伸缩
终极窗口尺寸编辑器:SRWE让你的应用程序窗口自由伸缩 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE Simple Runtime Window Editor (SRWE) 是一款革命性的开源工具,它能让你实时调整任何…...
QMCDecode:让音乐自由播放的开源格式转换工具
QMCDecode:让音乐自由播放的开源格式转换工具 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换结果存…...
3步突破显卡限制:如何让AMD/Intel显卡实现DLSS级画质?
3步突破显卡限制:如何让AMD/Intel显卡实现DLSS级画质? 【免费下载链接】OptiScaler OptiScaler bridges upscaling/frame gen across GPUs. Supports DLSS2/XeSS/FSR2 inputs, replaces native upscalers, enables FSR3 FG on non-FG titles. Supports N…...
Mermaid Live Editor:代码驱动图表的革新者,重新定义技术可视化流程
Mermaid Live Editor:代码驱动图表的革新者,重新定义技术可视化流程 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trendin…...
LoRA训练助手入门解析:为什么权重排序对LoRA训练效果影响显著
LoRA训练助手入门解析:为什么权重排序对LoRA训练效果影响显著 1. 认识LoRA训练助手 如果你正在尝试训练自己的AI绘画模型,可能会遇到一个常见问题:为什么同样的图片,用不同的标签训练出来的效果差距那么大?这就是我们…...
ExcelDataReader实战指南:高效处理Excel文件3步法掌握跨格式解析
ExcelDataReader实战指南:高效处理Excel文件3步法掌握跨格式解析 【免费下载链接】ExcelDataReader Lightweight and fast library written in C# for reading Microsoft Excel files 项目地址: https://gitcode.com/gh_mirrors/ex/ExcelDataReader ExcelDat…...
ResNet50人脸重建作品集:cv_resnet50_face-reconstruction在艺术创作中的人脸风格迁移底图生成
ResNet50人脸重建作品集:cv_resnet50_face-reconstruction在艺术创作中的人脸风格迁移底图生成 1. 项目介绍与核心价值 cv_resnet50_face-reconstruction 是一个基于ResNet50架构的人脸重建项目,专门为艺术创作和设计工作提供高质量的人脸底图生成服务…...
MyBatis批量更新避坑指南:从`<foreach>`拼接SQL到`allowMultiQueries`配置的完整流程
MyBatis批量更新实战:从基础实现到性能调优全解析 批量更新操作是后端开发中绕不开的高频需求,但很多开发者在初次接触MyBatis批量更新时,往往会陷入各种"坑"中。本文将带你系统掌握两种主流实现方案,从基础用法到性能优…...
基于SpringBoot+Vue的月度员工绩效考核管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
摘要 现代企业管理中,绩效考核是提升员工工作效率、优化人力资源配置的重要手段。传统的绩效考核多依赖纸质记录或简单的电子表格,存在数据易丢失、统计效率低、反馈周期长等问题。随着信息化技术的发展,企业亟需一套高效、精准的绩效考核管理…...
