Golang中函数的使用

news2024/10/7 6:42:55

目录

函数

函数特点

函数的使用

函数定义

函数的参数

函数的返回值

函数的变量作用域

函数的递归调用

函数的可变参数

函数的闭包

函数的 defer 语句

注意


函数

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

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

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

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

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

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

函数特点

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

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

3.可以定义匿名函数。

4.支持闭包。

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

6.可以使用可变参数。

函数的使用

函数定义

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

func 函数名(参数列表) (返回值列表) {
    函数体
}

其中:

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

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

func Add(x, y int) int {
    return x + y
}

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

函数的参数

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

func swap(x, y string) (string, string) {
   return y, x
}

函数的返回值

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

func sum(a int, b int) (int, int) {
   return a+b, a-b
}

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

a, b := sum(1, 2)

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

函数的变量作用域

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

函数的递归调用

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

func factorial(n uint64) (result uint64) {
   if (n > 0) {
      result = n * factorial(n-1)
      return result
   }
   return 1
}

函数的可变参数

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

func sum(numbers ...int) int {
   total := 0
   for _, number := range numbers {
      total += number
   }
   return total
}

函数的闭包

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

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
   }
}

以上代码输出:

1
2
3
1

函数的 defer 语句

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

func main() {
    defer fmt.Println("deferred")
    fmt.Println("regular")
}

这个程序输出:

regular
deferred

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

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

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语句的执行顺序是“后进先出”。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专享策略05 | MACD波段套利交易策略

量化策略开发,高质量社群,交易思路分享等相关内容 大家好,2023俱乐部有4个专享,6个通用。其中专享是2个套利,1个盘口,1个CTA。本期是专享05策略,本年度第二个套利策略。 01、策略介绍 策略以MA…

CH32V3xx RT-Thread Nano调试记录

目录 1、工程创建2、代码修改与调试2.1 RT-Thread 配置2.2 打印串口修改2.3 测试验证1、工程创建 使用MounRiver集成开发环境可以直接创建带有RT-Thread Nano的工程,步骤如下: 打开MounRiver,点击新建MounRiver工程; 在模板类型处选择RT-Thread,然后选择使用的芯片型号,…

UNeXt:基于MLP的快速医学图像分割网络

文章目录 UNeXt: MLP-Based Rapid Medical Image Segmentation Network摘要本文方法Shifted MLPTokenized MLP Stage 实验结果 UNeXt: MLP-Based Rapid Medical Image Segmentation Network 摘要 UNeXt:一种基于卷积多层感知器(MLP)的图像分…

【 WebSocket 框架 】

文章目录 一、背景介绍二、原理解析三、代码示例四、效果验证 一、背景介绍 WebSocket 是从 HTML5 开始支持的一种网页端和服务端保持长连接的 消息推送机制 理解消息推送: 传统的 web 程序, 都是属于 “一问一答” 的形式. 客户端给服务器发送了一个 HTTP 请求, 服务器给客户…

数据类型、python数字、数据类型转换、字符串

1、python的数据类型 可以使用type&#xff08;&#xff09;函数获取任何对象的数据类型 x 10 print(type(x)) # 打印<class int> 2、python 数字 Int 或整数是完整的数字&#xff0c;正数或负数&#xff0c;没有小数&#xff0c;长度不限。 浮动或“浮点数”是…

JavaScript全解析——express

express 的基本使用 ●express 是什么? ○是一个 node 的第三方开发框架 ■把启动服务器包括操作的一系列内容进行的完整的封装 ■在使用之前, 需要下载第三方 ■指令: npm install express 1.基本搭建 // 0. 下载: npm install express// 0. 导入 const express express()…

DNF命令介绍

DNF命令介绍 DNF是新一代的rpm软件包管理器。他首先出现在 Fedora 18 这个发行版中。而最近&#xff0c;它取代了yum&#xff0c;正式成为 Fedora 22 的包管理器。 1. 安装DNF包管理器 yum -y install dnf2. 命令介绍

MQTT 5协议中的基础更改(二)

上期文章中给大家介绍了MQTT规范版本5中基础更改的信息和CONNACK返回码&#xff0c;本篇文章我们继续介绍MQTT5协议中的基础更改中其他新功能的细节描述。 01 干净启动 MQTT 3.1.1的其中一个主流功能是MQTT客户端使用清除会话&#xff08;cleanSession&#xff09;&#xff0…

promise缓存与缓存思想的总结

promise缓存与缓存思想的总结 JS单例模式关于promise缓存 JS单例模式 单例模式&#xff0c;保证一个类有且仅有一个实例&#xff0c;并提供一个访问它的全局访问点 我们举个简单的例子 class SingletonFLX {constructor(name, age) {this.name name;this.age age;}//静态方法…

港联证券投资前瞻:碳酸锂价格持续反弹 银行板块步入可积极配置阶段

昨日&#xff0c;两市股指全线反弹走高&#xff0c;沪指涨超1%收复3300点&#xff1b;创业板指午后涨超2%&#xff1b;截至收盘&#xff0c;沪指涨1.17%报3310.74点&#xff0c;深成指涨1.57%报11178.62点&#xff0c;创业板指涨2.11%报2299.93点&#xff0c;上证50指数涨1.75%…

【案例教程】Biome-BGC生态系统模型与Python融合技术应用

Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数&#xff0c;模拟日尺度碳、水和氮通量的有效模型&#xff0c;其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算出每天…

无缝接入最新版NewBing

无缝接入最新版NewBing 1、NewBing 的接入网址 : 必应(bing.com) 2、接入方法: (1)必须使用 Microsoft Edge 浏览器 (2)注册一个自己的账号&#xff0c;注册步骤参考如下您可以通过以下步骤注册 Microsoft 账户 1.访问Microsoft的注册帐户页面 2.点击”创建账户”按钮。 3…

刷题65:不同的二叉搜索树

题意描述&#xff1a; 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 思路&#xff1a; 1、确定dp数组&#xff08;dp table&#xff09;以及下标的含义dp[i] &#xff1a;…

OA系统功能测试分析和学习教程(超详细)

OA系统可以简单快速地建立企业级的办公自动化系统。 办公自动化系统是员工及管理者使用频率最高的应用系统&#xff0c;可以极大提高公司的办公效率&#xff0c;帮助企业节省数字化、信息化办公的成本。本文中的OA系统来自于下面的资源&#xff1a; 包含诸多系统各功能模块&…

个人黄金投资要注意什么?如何降低黄金投资交易风险

黄金保值性强&#xff0c;自带避免功能&#xff0c;因此在投资者的理财组合中总能看到它的身影。但不可否认的是&#xff0c;黄金投资交易风险仍然存在。投资者在入场前应该多方了解&#xff0c;减小风险的危害。 黄金投资交易风险一、市场波动 全球影响黄金价格的因素有很多&…

51单片机中断系统

中断系统 1、中断介绍2、中断结构及相关寄存器中断满足的条件以及使用 3、外部中断实验外部中断介绍外部中断配置硬件设计软件设计 1、中断介绍 我们先来举一个生活事例&#xff1a; 你打开火&#xff0c;烧上一壶水。然后去洗衣服&#xff0c;在洗衣服的过程中&#xff0c;突…

python进程

队列 简介 在windows中&#xff0c;启动一个程序资源等于一个进程&#xff0c;进程是由多个线程组成的&#xff0c;进程理解为管理层&#xff0c;而线程是工人 通俗解释&#xff1a; 进程&#xff1a;能够完成多任务&#xff0c;比如&#xff0c;在同一台电脑上能够同时运行…

苹果手机怎么删除软件?彻底删除顽固app的3个方法!

案例&#xff1a;苹果手机有流氓软件删不掉怎么办&#xff1f; 【好烦&#xff0c;在网页上误点下载了一些流氓软件&#xff0c;怎么都删不掉&#xff0c;我该怎么办&#xff1f;求大神支招&#xff01;】 在苹果手机上删除软件通常是一个简单的过程&#xff0c;但有时候可能会…

【Java 基础】反射

反射是框架的灵魂。动态代理、很多框架&#xff08;SoringIOC、AOP等&#xff09;中都用到了反射。 概述&#xff1a; JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff08;包括私有的&#xff09;&#xff1b;对…

一款高效的企业级表格可视化搭建解决方案DripTable

DripTable 是京东零售推出的一款用于企业级中后台的动态列表解决方案&#xff0c;项目基于 React 和 JSON Schema&#xff0c;旨在通过简单配置快速生成页面动态列表来降低列表开发难度、提高工作效率。 DripTable 目前包含以下子项目&#xff1a;drip-table、drip-table-gene…