Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang中函数的使用

Golang中函数的使用

作者头像
周小末天天开心
发布于 2023-10-16 04:22:57
发布于 2023-10-16 04:22:57
24300
代码可运行
举报
运行总次数:0
代码可运行

函数

函数调用:函数调用时需要传递函数定义中要求的参数,并根据需要接收返回值。

匿名函数:匿名函数没有函数名,可以直接定义并调用。常用于函数内部作为闭包使用。

闭包:闭包是指一个函数内部定义的函数,它可以访问外部函数的变量,并将这些变量与函数绑定,形成一个闭合的环境。

可变参数:使用 ... 表示可变参数,可变参数必须放在函数参数列表的最后面,并且只能有一个。

函数作为参数:可以将函数作为参数传递给其他函数,这种函数称为高阶函数。常用于函数式编程中。

函数作为返回值:函数也可以作为返回值,这种函数称为闭包。常用于实现类似于装饰器或者切面等功能。

函数特点

1.函数可以有多个返回值。

2.可以将函数作为参数传递给其他函数。

3.可以定义匿名函数。

4.支持闭包。

5.函数可以有多个参数和多个返回值。

6.可以使用可变参数。

函数的使用

函数定义

Go语言中函数的定义使用 func 关键字,其基本语法格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func 函数名(参数列表) (返回值列表) {
    函数体
}

其中:

  • 函数名 表示函数的名称,遵循标识符的命名规则,采用驼峰命名法。
  • 参数列表 表示函数的输入参数,用逗号分隔,每个参数由参数名和参数类型组成,如 param1 type1, param2 type2
  • 返回值列表 表示函数的返回值,用括号括起来,可以是多个返回值,如 (type1, type2)
  • 函数体 表示函数的具体实现逻辑。

例如,下面是一个计算两个整数之和的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func Add(x, y int) int {
    return x + y
}

上述函数名为 Add,有两个参数 xy,类型都为 int,返回值类型为 int,函数体内部实现为将 xy 相加,并将结果返回。

函数的参数

函数可以有多个参数,参数的类型放在参数名的后面,如果两个或多个连续的参数的类型相同,则可以省略类型,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func swap(x, y string) (string, string) {
   return y, x
}
函数的返回值

函数可以返回多个值,这些值用括号括起来并用逗号分隔。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func sum(a int, b int) (int, int) {
   return a+b, a-b
}

可以使用 := 赋值语句来调用函数,并自动推断返回值类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a, b := sum(1, 2)

函数的参数是值传递,在函数调用时,传递的是实参的副本。

函数的变量作用域

函数中声明的变量作用域是该函数内部,在函数外部是不可见的。如果函数中使用了全局变量,则在函数中可以直接使用。

函数的递归调用

函数可以递归调用,递归调用必须有一个终止条件。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func factorial(n uint64) (result uint64) {
   if (n > 0) {
      result = n * factorial(n-1)
      return result
   }
   return 1
}
函数的可变参数

函数的可变参数是一个非常有用的特性,可以接受任意数量的参数。在参数列表的最后一个参数之前加上省略号 ... 即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func sum(numbers ...int) int {
   total := 0
   for _, number := range numbers {
      total += number
   }
   return total
}
函数的闭包

函数的闭包是指函数可以访问其外部作用域中的变量。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
   nextInt := intSeq()

   fmt.Println(nextInt())
   fmt.Println(nextInt())
   fmt.Println(nextInt())

   newInts := intSeq()
   fmt.Println(newInts())
}

func intSeq() func() int {
   i := 0
   return func() int {
      i += 1
      return i
   }
}

以上代码输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1
2
3
1
函数的 defer 语句

在Go语言中,函数的 defer 语句可以在函数返回时执行一些清理工作,如关闭文件、解锁资源等。defer 语句可以被插入到函数的任意位置,并且可以定义多个 defer 语句。在函数执行时,每个 defer 语句都会被压入一个栈中,等待函数返回时逆序执行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
    defer fmt.Println("deferred")
    fmt.Println("regular")
}

这个程序输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
regular
deferred

在这个例子中,当 main 函数执行到 defer 语句时,"deferred" 被压入一个栈中。然后程序继续执行,输出 "regular"。当函数返回时,栈中的 defer 语句被逆序执行,最后输出 "deferred"。

除了可以用来清理资源,defer 语句还可以用来记录函数的执行时间。下面是一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func timeTrack(start time.Time, name string) {
    elapsed := time.Since(start)
    log.Printf("%s took %s", name, elapsed)
}

func myFunc() {
    defer timeTrack(time.Now(), "myFunc")
    // 函数的实际代码
}

在这个例子中,timeTrack 函数用来记录函数的执行时间。在 myFunc 函数中,defer 语句被用来调用 timeTrack 函数,并传入当前时间和函数名作为参数。当 myFunc 函数返回时,timeTrack 函数被执行,输出函数的执行时间。

注意

  • 命名规范:函数名要有意义,采用驼峰命名法,首字母大写表示函数是公有的,首字母小写表示函数是私有的。
  • 参数传递:Go语言函数的参数传递采用值传递,如果需要修改传入的参数,可以传递指针。
  • 返回值:Go语言函数可以返回多个值,可以定义返回值的变量名,也可以省略变量名,但是建议写上变量名,方便代码阅读。
  • 错误处理:Go语言函数一般都会返回一个error类型的值来表示函数执行是否成功,需要在函数调用的地方进行错误处理。
  • 函数变量:在Go语言中,函数也可以作为变量使用,可以将函数赋值给变量,也可以作为参数传递给其他函数。
  • defer语句:defer语句用于在函数返回前执行一些清理操作,例如关闭文件、释放锁等。defer语句的执行顺序是“后进先出”。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Go 基础篇】Go语言函数详解:模块化编程与代码复用
函数是编程中的基本构建块,用于封装一段代码,使其可以被重复使用。在Go语言中,函数具有丰富的特性,如多参数、多返回值、匿名函数、闭包等,这使得Go语言函数不仅仅是一种执行代码的方式,还是构建模块化程序和实现代码复用的关键工具。本篇博客将深入探讨Go语言函数的各种特性,解释相关的名词,并通过示例演示如何使用函数来提高代码的可读性、可维护性和可扩展性。
繁依Fanyi
2023/10/12
3210
100天精通Golang(基础入门篇)——第15天:深入解析Go语言中函数的应用:从基础到进阶,助您精通函数编程!(进阶)
本篇文章是《100天精通Golang(基础入门篇)》系列的第15天,我们将继续深入解析Go语言中函数的应用。通过对函数的基础知识、参数传递、多返回值、作用域、匿名函数、闭包、延迟执行、错误处理、函数的高级特性以及Go语言函数与Java函数的区别进行探讨,我们将更全面地理解和应用函数的相关知识点。
猫头虎
2024/04/08
2370
100天精通Golang(基础入门篇)——第15天:深入解析Go语言中函数的应用:从基础到进阶,助您精通函数编程!(进阶)
Golang之旅9-函数
在Go语言的函数中return语句在底层并不是原子操作,它分为给返回值赋值和RET指令两步。而defer语句执行的时机就在返回值赋值操作后,RET指令执行前
皮大大
2021/03/02
2970
Go函数介绍与一等公民
函数对应的英文单词是 Function,Function 这个单词原本是功能、职责的意思。编程语言使用 Function 这个单词,表示将一个大问题分解后而形成的、若干具有特定功能或职责的小任务,可以说十分贴切。函数代表的小任务可以在一个程序中被多次使用,甚至可以在不同程序中被使用,因此函数的出现也提升了整个程序界代码复用的水平。
贾维斯Echo
2023/10/18
2070
Go函数介绍与一等公民
《Go语言程序设计》读书笔记(二)函数
《Go 语言程序设计》在线阅读地址:https://yar999.gitbooks.io/gopl-zh/content/
KevinYan
2019/12/30
4560
化整为零优化重用,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang函数的定义和使用EP07
    函数是基于功能或者逻辑进行聚合的可复用的代码块。将一些复杂的、冗长的代码抽离封装成多个代码片段,即函数,有助于提高代码逻辑的可读性和可维护性。不同于Python,由于 Go lang是编译型语言,编译之后再运行,所以函数的定义顺序无关痛痒。
用户9127725
2022/09/21
2060
4.Go编程快速入门学习
描述: Go 语言中的指针区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算是安全指针。
全栈工程师修炼指南
2022/09/29
6790
4.Go编程快速入门学习
go-函数
函数的参数和返回值都是可选的,例如我们可以实现一个既不需要参数也没有返回值的函数:
新人小试
2020/03/05
9120
go-函数
Go基础——function函数
我们以写一个计算商品价格的函数为例,输入参数是单件商品的价格和商品的个数,两者的乘积为商品总价,作为函数的输出值。
羊羽shine
2019/05/28
6680
Golang之旅30-函数与闭包
在调用函数的时候,会给该函数分配一个新的栈区。基本数据类型一般放在栈区,引用类型放在堆区。
皮大大
2021/03/02
3020
09.Go语言-函数
函数 是基于功能或逻辑进行封装的可复用的代码结构。将一段功能复杂、很长的一段代码封装成多个代码片段(即函数),有助于提高代码可读性和可维护性。由于 Go 语言是编译型语言,所以函数编写的顺序是无关紧要的。
面向加薪学习
2022/09/04
4100
Go语言学习示例04-函数及函数特性
在go语言中,支持多返回值,而且使用的频次还比较高一些,用的比较多的就是用于返回值和异常信息了!
用户5252199
2022/04/18
1820
学习go语言编程之函数
函数的基本组成:关键字func,函数名,参数列表,返回值,函数体,返回语句。 示例如下:
编程随笔
2023/10/15
1790
Go函数及与函数相关机制 【Go语言圣经笔记】
函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中其它地方多次调用。函数的机制可以让我们将一个大的工作分解为小的任务,这样的小任务可以让不同程序员在不同时间、不同地方独立完成。一个函数同时对用户隐藏了其实现细节(黑盒特性)。由于这些因素,对于任何编程语言来说,函数都是一个至关重要的部分。
Steve Wang
2021/12/06
1.2K0
第六章 函数式编程
1. 函数是组织好的、可重复使用的、用于执行指定任务的代码块。Go语言中支持函数、匿名函数和闭包,并且函数在Go语言中属于“一等公民”。
用户7798898
2020/09/27
3880
第六章 函数式编程
人生人生苦短,Let's Go !!!
函数既可以接受可变参数也可以接受固定参数,接受可变参数时放在函数的最后,固定参数当然是必须传值的,go语言中没有默认参数
疯狂的KK
2021/04/26
4120
人生人生苦短,Let's Go !!!
Golang函数
函数存在的一个非常明显的作用和意义就是代码重用。没有代码重用,编程人员会被活活累死,费尽千辛万苦写出来的代码只能使用一次,有类似的功能需要完成时,不得不重头开始写起。
PayneWu
2020/12/18
5900
Golang之轻松化解defer的温柔陷阱
defer是Go语言提供的一种用于注册延迟调用的机制:让函数或语句可以在当前函数执行完毕后(包括通过return正常结束或者panic导致的异常结束)执行。深受Go开发者的欢迎,但一不小心就会掉进它的温柔陷阱,只有深入理解它的原理,我们才能轻松避开,写出漂亮稳健的代码。
梦醒人间
2019/05/21
4030
Golang之轻松化解defer的温柔陷阱
defer是Go语言提供的一种用于注册延迟调用的机制:让函数或语句可以在当前函数执行完毕后(包括通过return正常结束或者panic导致的异常结束)执行。
李海彬
2019/05/14
8240
Golang 跟 Python3的区别对比有哪些?
本文对比这两门语言目的不是争谁优谁略,只是为了对比学习,适合掌握Python想学Go或者掌握Go想学Python的同学们参考。
程序员小新
2021/12/16
1.8K0
Golang 跟 Python3的区别对比有哪些?
相关推荐
【Go 基础篇】Go语言函数详解:模块化编程与代码复用
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验