当前位置: 首页 > news >正文

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&#xff0c…...

Oracle删除列操作:逻辑删除和物理删除

概念 逻辑删除:逻辑删除并不是真正的删除,而是将表中列所对应的状态字段(status)做修改操作,实际上并未删除目标列数据或恢复这些列占用的磁盘空间。比如0是未删除,1是删除。在逻辑上数据是被删除了&#…...

找出字符串中第一个匹配项的下标、求解方程----2023/5/2

找出字符串中第一个匹配项的下标、求解方程----2023/5/2 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

push [特殊字符] present

push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...