【Hello Go】Go语言函数
Go语言函数
- 定义格式
- 自定义函数
- 无参数无返回值
- 有参数无返回值
- 不定参数列表
- 有返回值
- 有多个返回值
- 函数类型
- 匿名函数和闭包
- 延迟调用defer
- defer和匿名函数结合使用
- 获取命令行参数
定义格式
函数是构成代码执行的逻辑结构
在Go语言中 函数的基本组成为
- func关键字
- 函数名
- 参数列表
- 返回值
- 函数体
- 返回语句
基本代码格式如下
func // 函数名(// 参数) (// 返回值) { // 函数语句// 可以return多个返回值
}
函数定义说明:
- func关键字 : Go语言声明函数必须要使用func关键字
- 函数名称 : Go语言的函数名称默认规则为 开头为小写字母即为私有 否则即为公有
- 参数列表: 支持多个参数 多个参数之间用逗号分隔开 不支持默认参数
- 返回类型: 我们可以有多个返回类型
- 返回值: 如果有返回值 我们必须要添加return语句
自定义函数
无参数无返回值
下面是无参数无返回值函数的定义和调用
// 无参数无返回值函数的定义
func test() {fmt.Println("hello world")
}func main() {// 调用test()
}
有参数无返回值
// 有参数无返回值函数的定义
func test2(a , b int) {}func test3(a int , b int) {}
这里的定义方式有两种 一种是每个标识符后面都添加数据类型 一种是将数据类型添加在最后(如果都一样的话)
func main() {// 调用test2(10 , 10)
}
不定参数列表
不定参数是指函数传入的参数不确定 为了做到这点 我们首先要将函数定义为接受不定参数类型
定义代码如下
func test4(args ...int) { for _, v := range args {fmt.Println(v)}
}
形如 ... type 格式类型只能作为函数的参数类型存在 并且只能作为最后一个参数
// 函数调用 可以传递0~多个数据test4()test4(1)test4(1 , 2, 3, 4)
不定参数的传递
不定参数也会遇到需要继续往下传递参数的情况 下面是不定参数传递的两段代码
func test4(args ...int) { for _, v := range args {fmt.Println(v)}
}func test5(args ...int) { for _, v := range args {fmt.Println(v)}
}func test6(args ...int){test4(args ...) // 传递方式一 直接将所有参数全部传入 格式如图test5(args[1:]...) // 传递方式二 将参数列表中从1开始(包括1位置)全部传入
}
在我们的test6函数中演示了 用不定参数传参数的两种方式
方式二中我们使用了切片 不了解的同学可以暂时放放 下面几篇博客中会进行讲解
这里我们只需要记住传参的格式是 args ...
有返回值
我们的返回值定义在参数后面
虽然说我们在定义返回值的时候可以省略标识符 直接使用类型 但是官方文档确不推荐我们这么做 因为这样子做会导致我们程序的可读性变差
我们推荐下面这种定义方式
func test7(key int) (value int) {return 1
}
如果一个函数有返回值 那么我们在函数的最后就必须要返回一个值 否则会编译不通过
有多个返回值
在函数有多个返回值的情况下 我们有两种返回方式
方式一 : 给各个返回值标识符命名 之后return
func test9(key int) (a1 int , a2 int) {a1 = 1 a2 = 2return
}
方式二: 直接return多个返回值
func test8(key int) (a1 int , a2 int) {return 1 , 2
}
函数类型
在Go语言中 函数也是一种数据类型
我们可以通过type来定义它 它的类型就是拥有相同参数 相同返回值的类型
我们可以用它来做到一些好玩的事情 比如说函数套函数
我们下面定义了一个函数类型 给他取别名为 FuncType
type FuncType func(int , int) (int) // 声明了一个函数类型 注意 func后面没有函数名
那么我们就可以在下面的函数中 使用这个FuncType作为参数
type FuncType func(int , int) (int) // 声明了一个函数类型 注意 func后面没有函数名 func Clac(a int , b int , f FuncType)(result int){result = f(a , b)return result
}func Add(a int , b int) (result int){result = a + b return result
}
之后我们就可以这么调用这个函数
res := Clac(10 , 8 , Add)
匿名函数和闭包
这里先给大家解释下闭包的概念
闭包就是一个函数 捕获 了和他在同一作用域的其他变量和常量
这也就意味着 当一个函数闭包了 不管这个函数在任何地方被调用 它都能使用这些变量和常量 不管它们有没有出作用域
所以说 只要闭包还在使用 这些变量就会一直存在 不会销毁
在Go语言中 所有的匿名函数都是闭包的
下面简单介绍几种匿名函数的定义方式 解释就直接放在注释里面了
// 这两个参数会被我们下面的匿名函数捕获var a int = 10var str string = "abcde"// 方式一 使用:= 来让一个变量接收func类型f1 := func() { // 这里的func()是一个匿名函数 无参数无返回值fmt.Println(a, " ", str)}
// 方式二 在你们函数的末尾直接调用func(a int , b int)(result int){result = a + bfmt.Println(result)return result}(1 , 1)
匿名函数的闭包是引用
如果我们在匿名函数内部 修改了闭包的变量 那么外部的值也会改变
var a int = 10 var str string = "abcde"f1 := func(){a = 20str = "go"}f1()// 此时打印a 和 str 我们会发现它们的值改变了 fmt.Println(a , str)
}
返回值为匿名函数
我们都知道 局部变量在出了作用域之后就会被销毁 但是我们如果使用匿名对象作为返回值 就能够让该变量存在的时间延长 比如说下面的代码
func squares() (func() int) {var x int return func() (ans int){x++return x * x}
}func main() {f := squares()fmt.Println(f())fmt.Println(f())fmt.Println(f())fmt.Println(f())
}
解释下 我们 squares 函数的返回值是一个匿名对象
该匿名对象将局部变量 x 捕捉了 并且在内部++ 之后平方
因此 该局部变量的生命周期被延长了 所以说我们最后得到的结果会是
1 4 9 16 … …
延迟调用defer
关键字defer用于延时一个函数或者是方法的调用
需要注意的是 defer方法只能出现在函数的内部
func test() {defer fmt.Println("no.1")fmt.Println("no.2")
}func main() {test()defer fmt.Println("no.3")fmt.Println("no.4")// 输出结果为 2 1 4 3
}
上面的两个函数演示了defer关键字的作用
在一个作用域内 如果我们使用了defer关键字 那么语句就会在作用域即将被销毁的时候执行
如果说有多个defer语句的话 遵循栈的原则 也就是后进先出
这里需要注意的一点是
如果有某个函数或者某个延时调用发生错误 整个栈也会被清空 也就是所有延时调用语句都会执行
func test() {defer fmt.Println("no.1")fmt.Println("no.2")
}func test1(x int) {v1 := 100 / x_ = v1
}func main() {test()defer fmt.Println("no.3")fmt.Println("no.4")defer test1(0) // 会发生错误// 输出结果为 2 1 4 3
}
就比如说上面的代码 我们故意写了除0错误 但是它的执行结果却是所有语句都运行完毕之后再报错
defer和匿名函数结合使用
func main() {a , b := 10 , 20 defer func(x int) {fmt.Println(x)} (a) // 将a以传值传递的方式传递给匿名函数funca += 10 b += 100fmt.Println(a)fmt.Println(b)// 输出为 20 120 10
}
获取命令行参数
在Go语言中 如果我们要获取命令行参数的话 需要使用到os包
代码演示如下
func main() {args := os.Args // 获取用户的所有参数// 如果获取失败 或者是参数不足则报错 否则打印出前两个参数if args == nil || len(args) < 2{fmt.Println("err!!")return}ip := args[1]port := args[2]fmt.Println(ip)fmt.Println(port)
}
相关文章:
【Hello Go】Go语言函数
Go语言函数 定义格式自定义函数无参数无返回值有参数无返回值不定参数列表有返回值有多个返回值 函数类型匿名函数和闭包延迟调用deferdefer和匿名函数结合使用 获取命令行参数 定义格式 函数是构成代码执行的逻辑结构 在Go语言中 函数的基本组成为 func关键字函数名参数列表…...
docker小技能:容器IP和宿主机IP一致( Nacos服务注册ip为内网ip,导致Fegin无法根据服务名访问 )
文章目录 I 预备知识1.1 Docker组成1.2 命名空间 (进程隔离)1.3 Docker的网络模式1.4 容器IP和宿主机IP一致1.5 容器时间和服务器时间的一致性II 常用命令2.1 案例:流水线docker 部署2.2 删除没有使用的镜像2.3 shell 不打印错误输出2.4 阿里云流水线/jenkins忽略shell步骤中…...
Android笔记:震动实现
Android震动可以通过Vibrator类实现。以下是一个简单的代码示例: 注:需要注意,震动需要在子线程中执行,所以应该在一个异步任务中执行上述代码,或者使用Handler等机制将其发送到主线程中进行执行。 1、在AndroidMani…...
CSDN每日一题学习训练——Java版(二叉搜索树迭代器、二叉树中的最大路径和、按要求补齐数组)
版本说明 当前版本号[20231115]。 版本修改说明20231115初版 目录 文章目录 版本说明目录二叉搜索树迭代器题目解题思路代码思路参考代码 二叉树中的最大路径和题目解题思路代码思路参考代码 按要求补齐数组题目解题思路代码思路参考代码 二叉搜索树迭代器 题目 实现一个二…...
WPF中有哪些布局方式和对齐方法
在WPF (Windows Presentation Foundation) 中,你可以使用多种方式来进行元素的对齐,这主要取决于你使用的布局容器类型。以下是一些最常用的对齐方式: HorizontalAlignment 和 VerticalAlignment 在大多数WPF元素上,你可以使用 Ho…...
【2012年数据结构真题】
41题 (1) 最坏情况下比较的总次数 对于长度分别为 m,n 的两个有序表的合并过程,最坏情况下需要一直比较到两个表的表尾元素,比较次数为 mn-1 次。已知需要 5 次两两合并,故设总比较次数为 X-5, X 就是以 N…...
k8s_base
应用程序在服务器上部署方式的演变,互联网发展到现在为止 应用程序在服务器上部署方式 历经了3个时代1. 传统部署 优点简单 缺点就是操作系统的资源是有限制的,比如说操作系统的磁盘,内存 比如说我8G,部署了3个应用程序,当有一天…...
2023年亚太杯APMCM数学建模大赛数据分析题MySQL的使用
2023年亚太杯APMCM数学建模大赛 以2022年C题全球变暖数据为例 数据分析: 以2022年亚太杯数学建模C题为例,首先在navicat建数据库然后右键“表”,单击“导入向导”,选择对应的数据格式及字符集进行数据导入 导入之后,…...
自学SLAM(8)《第四讲:相机模型与非线性优化》作业
前言 小编研究生的研究方向是视觉SLAM,目前在自学,本篇文章为初学高翔老师课的第四次作业。 文章目录 前言1.图像去畸变2.双目视差的使用3.矩阵微分4.高斯牛顿法的曲线拟合实验 1.图像去畸变 现实⽣活中的图像总存在畸变。原则上来说,针孔透…...
STL—next_permutation函数
目录 1.next_permutation函数的定义 2.简单使用 2.1普通数组全排列 2.2结构体全排列 2.3string 3.补充 1.next_permutation函数的定义 next_permutation函数会按照字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。与其相对的还有一个函数—…...
Mysql 三种不使用索引的情况
目录 1. 查询语句中使用LIKE关键字 例 1 2. 查询语句中使用多列索引 例 2 3. 查询语句中使用OR关键字 例 3 总结 索引可以提高查询的速度,但并不是使用带有索引的字段查询时,索引都会起作用。使用索引有几种特殊情况,在这些情况下&…...
Ladybug 全景相机, 360°球形成像,带来全方位的视觉体验
360无死角全景照片总能给人带来强烈的视觉震撼,有着大片的既视感。那怎么才能拍出360球形照片呢?它的拍摄原理是通过图片某个点位为中心将图片其他部位螺旋式、旋转式处理,从而达到沉浸式体验的效果。俗话说“工欲善其事,必先利其…...
centos 6.10 安装swig 4.0.2
下载地址 解压文件。 执行下面命令 cd swig-4.0.2 ./configure --prefix/usr/local/swig-4.0.2 make && make install...
mask: rle, polygon
RLE 编码 RLE(Run-Length Encoding)是一种简单而有效的无损数据压缩和编码方法。它的基本思想是将连续相同的数据值序列用一个值和其连续出现的次数来表示,从而减少数据的存储或传输量。 在图像分割领域(如 COCO 数据集中&#…...
【JMeter】JMeter压测过程中遇到Non HTTP response code错误解决方案
压测过程中并发逐步加大后遇到60%的错误率,查看错误是JMeter网页版聚合报告中显示 Non HTTP response code: java.net.NoRouteToHostException/Non HTTP response message: Cannot assign requested address (Address not available) 这是第二次遇到,故…...
【Kingbase FlySync】评估工具安装及使用
【Kingbase FlySync】评估工具使用 概述准备环境目标资源1.测试虚拟机下载地址包含node1,node22.评估工具下载地址3.exam.sql下载地址 评估工具安装1.上传并解压评估工具安装包2.安装数据库驱动包3.设置环境变量4.node1载入样例信息 收集并阅读node1信息1.收集报告2.阅读报告 收…...
pandas教程:Data Aggregation 数据聚合
文章目录 10.2 Data Aggregation(数据聚合)1 Column-Wise and Multiple Function Application(列对列和多函数应用)2 Returning Aggregated Data Without Row Indexes(不使用行索引返回聚合数据) 10.2 Data…...
开启创造力之门:掌握Vue中Slot插槽的使用技巧与灵感
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、s…...
【算法练习Day48】回文子串最长回文子序列
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 回文子串最长回文子序列总结…...
ubuntu下C++调用matplotlibcpp进行画图(超详细)
目录 一、换源 二、安装必要的软件 三、下载matplotlibcpp 四、下载anaconda 1.anaconda下载 2.使用anaconda配置环境 五、下载CLion 1.下载解压CLion 2.替换jbr文件夹 3.安装CLion 4.激活CLion 5.CLion汉化 6.Clion配置 六、使用CLion运行 七、总结 我的环…...
企业级母婴商城系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
摘要 随着互联网技术的快速发展和电子商务的普及,母婴用品市场呈现出蓬勃发展的态势。年轻父母对于母婴产品的需求日益多样化,传统的线下零售模式已无法满足其便捷、高效、个性化的购物需求。因此,构建一个功能完善、安全可靠的企业级母婴商城…...
Qwen3.5-2B入门指南:如何将本地7860服务映射为公网可访问API接口
Qwen3.5-2B入门指南:如何将本地7860服务映射为公网可访问API接口 1. 引言 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型,属于Qwen3.5系列的小参数版本(20亿参数)。这个模型主打低功耗、低门槛部署,特别适合在端侧和…...
Zephyr与MCUBoot的深度整合:从构建到安全启动的完整指南
1. 为什么需要安全启动? 在嵌入式开发中,设备固件的安全性往往是最容易被忽视的一环。想象一下,如果你的智能门锁固件被恶意篡改,或者医疗设备的程序被非法替换,后果会有多严重?这就是为什么我们需要MCUBoo…...
降低AI检测率哪个工具好?10款免费工具2026亲测,亲测有用
很多同学在写论文时都会遇到同一个难题:用AI辅助写完的内容,一查AIGC率高到离谱,被导师打回要求整改。后台最近也收到不少私信问:怎么才能有效降低AI检测率?有没有靠谱的免费降AI率工具推荐? 我自己当初也踩…...
别再只盯着虚短虚断!运放设计必须掌握的6个非理想参数(附MCP6N16实测数据)
运算放大器非理想特性实战指南:从理论到MCP6N16实测 在嵌入式系统设计中,运算放大器如同精密仪器中的齿轮,其微小偏差可能导致整个测量系统的崩溃。许多工程师在初期学习阶段被"虚短虚断"的理想模型所束缚,直到实际项目…...
Windows 11本地Ollama大模型部署实战指南
1. Windows 11本地部署Ollama大模型的前期准备 最近在折腾本地大模型部署,发现Ollama这个工具确实挺适合新手入门的。相比其他复杂的部署方案,Ollama在Windows平台上的安装过程简单明了,而且支持多种主流开源大模型。不过在实际操作中&#x…...
手把手教你编译运行openHiTLS社区的FrodoKEM源码(附完整环境配置)
从零构建FrodoKEM开发环境:openHiTLS社区源码实战指南 当量子计算机从理论走向现实,传统加密算法正面临前所未有的挑战。FrodoKEM作为后量子密码学领域的明星算法,以其坚实的数学基础和简洁的实现逻辑,成为开发者探索抗量子加密技…...
告别旋转锚点!用Oriented R-CNN在DOTA数据集上轻松实现高精度遥感目标检测(附开源代码)
突破传统限制:Oriented R-CNN在遥感目标检测中的实战指南 遥感图像中的目标检测一直是计算机视觉领域的难点之一。不同于常规图像中的物体,遥感目标往往以任意角度出现,传统水平边界框检测方法难以准确捕捉其空间位置。想象一下,…...
不止是拆网卡:以联想ThinkCentre M7131z为例,聊聊老旧一体机的升级改造可能性
联想ThinkCentre M7131z改造指南:从拆网卡到全面性能升级 老旧商用一体机往往被贴上"性能瓶颈"的标签,但联想ThinkCentre M7131z系列却隐藏着令人惊喜的改造潜力。这台发布于2015年前后的商用一体机,凭借其模块化设计和充足的内部空…...
AI辅助开发智能车:让快马平台优化你的图像处理与识别算法
最近在准备智能车竞赛,遇到了一个头疼的问题:摄像头采集的图像受环境光影响太大,导致巡线识别不稳定。特别是在弯道和阴影区域,传统固定阈值的二值化方法完全失效。经过反复尝试,发现用InsCode(快马)平台的AI辅助开发功…...
