Go语言函数

news/2024/4/20 6:28:56/文章来源:https://blog.csdn.net/ZN175623/article/details/127631600

什么是函数

func main() {fmt.Println("hello,world")//调用函数fmt.Println(add(1, 2))
}// func 函数名(参数,参数。。。),函数调用返回值类型()
func add(a, b int) int {c := a + breturn c
}

函数的声明与调用

func main() {//函数的调用printinfo()myprint("zhounan")myprint2(add2(1, 2))x, y := swap("zhounan", "daawei")fmt.Println(x, y)}// 无参无返回值
func printinfo() {fmt.Println("printinfo")
}// 一个有参的函数
func myprint(msg string) {fmt.Println(msg)
}
func myprint2(msg int) {fmt.Println(msg)
}// 两个有参的函数
func add2(a, b int) int {c := a + breturn c
}// 有多个返回值
func swap(x, y string) (string, string) {return y, x
}

形式参数和实际参数

func main() {a := max(90, 100)fmt.Println(a)
}// max 两个数字比大小
// 形式参数 num1,num2
// 实际参数 你输入的两个值
func max(num1, num2 int) int {var result intif num1 > num2 {result = num1} else {result = num2}return result
}

可变参数

// 可变参数
func main() {getSun(1, 2)}
func getSun(nums ...int) {sum := 0for i := 0; i < len(nums); i++ {fmt.Println(nums[i])sum = sum + nums[i]}fmt.Println("sum:", sum)}

值传递

func main() {//值传递//定义数组 [个数]类型{初始化}//修改arr2并不会影响arr1//值传递 传递的是数据的副本,修改数据,对于原始的数据没有影响//值传递的类型,默认是值传递,基础类型,array,structarr := [4]int{1, 2, 3, 4}//传递:传递arrfmt.Println(arr)update(arr)}
func update(arr2 [4]int) {fmt.Println("arr2接收的数据", arr2)arr2[0] = 100fmt.Println("arr2修改后的数据", arr2)
}

引用传递

// 引用传递
func main() {//切片,可以扩容的数组s1 := []int{1, 2, 3, 4}fmt.Println("默认的数据", s1)//传入的是一个引用类型的数据update2(s1)fmt.Println("调用后的数据", s1)}
func update2(s2 []int) {fmt.Println("传递的数据", s2)s2[0] = 100fmt.Println("修改后的数据", s2)
}

在这里插入图片描述

函数变量的作用域

// 全局变量
var num int = 100func main() {temp := 100if b := 1; b <= 10 {//语句内的局部变量temp := 50fmt.Println(temp) //局部变量就近原则fmt.Println(b)fmt.Println(num)}fmt.Println(temp)fmt.Println(num)
}
func f1() {//局部变量a := 1fmt.Println(a)
}

在这里插入图片描述

函数递归

// 函数递归,自己调用自己
func main() {sum := getSum1(5)fmt.Println(sum)
}
func getSum1(n int) int {if n == 1 {return 1}return getSum1(n-1) + n}

defer 延迟函数执行

// defer 关闭操作
func main() {a := 10fmt.Println("a=", a)defer f(a) //参数已经传进去了,在最后执行a++fmt.Println("end a=", a)}
func f(s int) {fmt.Println("函数里面的a=", s)
}

在这里插入图片描述

函数本质的探讨

// func() 本身就是一种数据类型
// a1 如果不加括号函数就是一个变量
func main() {fmt.Printf("%T\n", a1)//定义函数类型的变量var a2 func(int, int)a2 = a1//他们地址是一样的fmt.Println(a1)fmt.Println(a2)a2(1, 2)
}
func a1(a, b int) {fmt.Println(a, b)
}

在这里插入图片描述

匿名函数的推导


// 匿名函数
func main() {b1()b2 := b1 //函数本身也是一个变量 加了括号就运行b2()//匿名函数f3 := func() {fmt.Println("我是b3函数")}f3()r1 := func(a, b int) int {//fmt.Println(a, b)//fmt.Println("我是b4函数")return a + b}(1, 2)fmt.Println(r1)}
func b1() {fmt.Println("我是b1函数")
}

回调函数

// 回调函数
// 高阶函数,根据go语言的数据类型的特点,可以将一个函数作为另一个函数的参数
// fun1() fun2()
// 将fun1函数作为fun2这个函数的参数
// fun2函数就叫做高阶函数,接收了一个函数作为参数的函数
// fun1函数,就叫做回调函数,作为另一个函数的参数
func main() {r1 := adda(1, 2)fmt.Println(r1)r2 := oper(3, 4, adda)fmt.Println(r2)r3 := oper2(8, 6, sub)fmt.Println(r3)r4 := oper(8, 4, func(a, b int) int {if b == 0 {fmt.Println("除数不能为0")return 0}return a / b})fmt.Println(r4)nan := func(a, b int) int {return a + b}(1, 2)fmt.Println(nan)}// 高阶函数
func oper(a, b int, fun func(int, int) int) int {r := fun(a, b)return r
}
func oper2(a, b int, fun func(int, int) int) int {r := fun(a, b)return r
}
func adda(a, b int) int {return a + b
}
func sub(a, b int) int {return a - b
}

函数闭包结构的理解

/*
一个外层函数中,有内层函数,该内层函数中,会操作外层函数的局部变量
并且该外层函数的返回值就是这个内层函数
这个内层函数和外层函数的局部变量,统称为闭包结构局部变量的生命周期就会发生改变,正常的局部变量会随着函数的调用为船舰,随着函数的结束二销毁
但是闭包结构中的外层函数的局部变量并不会随着外层函数的结束而销毁,因为内层函数还在继续使用
*/
func main() {r1 := increment()fmt.Println(r1)v1 := r1()fmt.Println(v1)v2 := r1()fmt.Println(v2)fmt.Println(r1())fmt.Println(r1())fmt.Println(r1())//如果调用r2表示r1外层函数已经销毁,但是函数内层的i还是存在//正常情况下r2的创建r1应该已经销毁,因为r2重新调用了increment()r2 := increment()v3 := r2()fmt.Println(v3)fmt.Println(r1())fmt.Println(r1())
}// 自增
func increment() func() int {//局部变量i := 0//定义一个匿名函数,给变量自增并返回fun := func() int { //内层函数,没有执行i++return i}return fun
}

在这里插入图片描述

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

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

相关文章

Ray tracing 光线追踪 之 embree ,从入门到精通 02 从源码编译与安装

1. 下载预编译的ispc&#xff0c;安装 网址&#xff1a; https://ispc.github.io resources -> github page 进入ispc 的github的release页&#xff1a;Releases ispc/ispc GitHub 找到一个预编译好了的ispc&#xff0c;其中在windows平台上是&#xff1a;https://github…

Redis缓存穿透、击穿、雪崩介绍

面试高频&#xff0c;工作常用 缓存穿透&#xff08;查不到&#xff09; 概念 用户想要查询一个数据&#xff0c;发现redis内存数据库没有&#xff0c;也就是缓存没有命中&#xff0c;于是向持久层数据库查询。发现也没有&#xff0c;于是本次查询失败&#xff0c;当用户很多的…

GO实现跳跃表

GO实现跳跃表 文章目录GO实现跳跃表跳跃表介绍跳跃表的实现跳跃表的结构创建跳跃表跳跃表的插入和删除跳跃表的排名操作跳跃表的区间操作完整实现跳跃表介绍 跳跃表&#xff08;skiplist&#xff09;是一种有序的数据结构&#xff0c;它通过建立多层"索引"&#xff…

世界城市日|数字城市里看不见的“保安”,真面目竟是…

2022年10月31日&#xff0c;是第8个世界城市日。在数字化浪潮席卷全球的当下&#xff0c;城市发展亦进入新的阶段。建造数字城市&#xff0c;全面推进城市数字化转型成为当前城市建设的热议话题。数字城市、万物互联&#xff0c;与网络空间的融合必不可少。然而系统的复杂度越高…

简单使用gige千兆网口工业相机,国产崛起(二,c#)

发现海康的sdk不错&#xff0c;可以用海康&#xff0c;basler&#xff0c;大华工业相机&#xff0c;估计其他的也可以&#xff0c;有机会试一试&#xff01;国产厉害&#xff0c;崛起了&#xff01;赞一个&#xff0c;热情爆棚&#xff01;且随窃喜&#xff01; 首先下载海康工…

网站SEO标题撰写技巧,做到这些可以提高点击率

搜索引擎认为&#xff0c;一个网站的点击率越高&#xff0c;那么这个网站就越受欢迎&#xff0c;因此就会提高网站的关键词排名。网站的点击率越高&#xff0c;就会获得更多流量。网站标题和点击率息息相关&#xff0c;一个好的网站标题&#xff0c;能够轻松获得流量。那么&…

[carla入门教程]-2 pythonAPI的使用

本专栏教程将记录我从安装carla到调用carla的pythonAPI进行车辆操控的全流程,带领大家从安装carla开始,到最终能够熟练使用carla仿真环境进行传感器数据采集和车辆控制. 第二节 pythonAPI的使用 本小节主要学习使用 pythonAPI来与carla服务器进行交互.包括获取信息,发送信息.…

IDEA热部署插件JRebel使用

JRebel安装与激活 JRebel 使用 此时已经安装好并已激活&#xff0c;我们使用 JRebel debug的时候&#xff0c;修改代码&#xff0c;不能实现热部署&#xff0c;因此还需要设置其他地方 1.项目自动编译 设置 compiler.automake.allow.when.app.running ctrlshiftA 或者 help->…

vue相关原理

vue 原理 面试为什么要考察原理 知其然知其所以然&#xff0c;各行各业通用的道理了解原理才能用的很好&#xff0c;专业性考察&#xff0c;技术的追求竞争激烈&#xff0c;则优录取大厂造轮子&#xff08;业务定制&#xff1a;有些框架不能满足需求&#xff09; 面试中如何…

【Spark NLP】第 19 章:生产化 NLP 应用程序

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

docker下快速部署openldap与PHPLdapAdmin

在一个组织中&#xff0c;为了简化各种内部系统的账号和密码的管理&#xff0c;往往就需要ldap来进行管理了。 对于ldap的实现方式也非常多&#xff0c;但在免费的开源系统中&#xff0c;openldap是ldap的首选系统。 同时&#xff0c;在这一切讲究快速的时代&#xff0c;采用d…

大数据ClickHouse进阶(二十二):ClickHouse优化

文章目录 ClickHouse优化 一、表优化 1、日期字段避免使用String存储 2、Nullable值处理 <

计算机毕业设计(附源码)python音蕾心动

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

云IDE的简单使用、体验与学习

云IDE的简单使用、体验与学习一、简单尝试二、官网展示的特点三、视频用例3.1、用Cloud IDE快速启动开源项目3.2、用Cloud IDE 在线提交PR云IDE产品介绍 云IDE使用教程 免费使用地址&#xff1a;点击【云IDE】&#xff0c;即可开始创建工作空间。 一、简单尝试 快速创建工作空…

学习用Python实现PPT的自动化

前言 在日常工作中&#xff0c;我们总是需要创建或修改PPT。但你也可以用Python来创建或修改PPT文件。本文将告诉你如何使用Python-pptx模块自动或用PPT模板生成ppt&#xff0c;以及如何通过实例修改现有的PPT。 &#xff08;文末送福利&#xff09; 1.Python模块python-ppt…

hbuilderx ios自定义基座真机测试

任务描述&#xff1a; 用uniapp框架写了一个app应用&#xff0c;需要在ios苹果手机上真机运行测试。 hbuilderx不再支持标准基座真机运行了&#xff0c;需要自定义基座运行 制定自定义基座需要准备的材料&#xff1a; ios的appid,profile文件&#xff0c;私钥证书&#xff0…

动视是否磨灭了暴雪的灵魂?

对于成千上万的人&#xff0c;也许是数百万人来说&#xff0c;暴雪是——或者曾经是——一家特殊的公司。 暴雪——游戏开发的典范 对于奇幻世界的关注&#xff0c;暴雪是无与伦比的。如果游戏没有准备好&#xff0c;它就不会发布。1998 年&#xff0c;尽管《魔兽争霸&#xf…

算法复杂度分析

复杂度分析 参考&#xff1a;《算法导论》、复杂度 - OI Wiki (oi-wiki.org)、一文弄懂算法的时间和空间复杂度分析 - 知乎 (zhihu.com)、算法讲解之复杂度分析 - 知乎 (zhihu.com)、算法的时间复杂度和空间复杂度-总结_zolalad的博客-CSDN博客_时间复杂度 算法复杂度分析的阶段…

梦开始的地方 —— C语言数据在内存中的存储(整形+浮点型)

文章目录整形在内存中的存储1. 数值类型的基本分类2. 整形在内存中的存储1. 原码、反码、补码2. 内存中为什么要存放补码&#xff1f;3. 大小端存储4. 无符号有符号数练习5. 有符号数无符号数小结浮点型在内存中的存储IEEE 754整形在内存中的存储 1. 数值类型的基本分类 整形…

AJAX基础+Axios快速入门+JSON使用+综合案例

目录1、 AJAX1.1 概述1.1.1 作用1.1.2 同步和异步1.2 快速入门1.2.1 服务端实现1.2.2 客户端实现1.3 案例1.3.1 需求1.3.2 分析1.3.2 后端实现1.3.3 前端实现2、 Axios异步框架2.1 基本使用2.2 快速入门2.2.1 后端实现2.2.2 前端实现2.3 请求方法别名3、 JSON3.1 概述3.2 JSON基…