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

【Golang】函数篇

1、golang函数基本定义与使用

func 函数名 (形参列表) (返回值类型列表) {函数体return + 返回值列表
}

其中func用于表明这是一个函数,剩下的东西与其他语言的函数基本一致,在定义与使用的时候注意函数名、参数、返回值书写的位置即可。下面使用一个例子说明:求两个整数的和

func main() {fmt.Println("10 + 20 = ", getSum(10, 20))
}func getSum (num1, num2 int) int { //这里的返回值类型列表如果只有一个返回值,那么() 可以省略return num1 + num2
}

在这里插入图片描述
一些函数的使用细节:

  1. 函数与函数是并列的关系,因此不能嵌套定义
  2. 函数名的定义需要遵循标识符命名规范,
    即 首字符不能是数字
      函数名首字母大写表明该函数可以被本包文件和其他包文件使用
      函数名首字母小写表明只能被本包文件使用 其他包文件不能使用
  3. 形参列表 可以是若干个参数 0,1,2 ····
  4. 返回值类型列表:可以返回若干个,取决于函数的实现以及应用场景。对于返回值有多个的情况,如果在某一特定场景下,有些返回值不想使用,那么可以选择使用 "_"来告诉编译器这个返回值自动丢弃,不接收

2、golang函数传递参数相关细节

经典案例引入:实现一个函数exchangeNum函数,交换两个数的值

func exchangeNum(n1, n2 int) {var temp int = n1n1 = n2n2 = temp
}func main() {var num1 int = 100var num2 int = 200fmt.Printf("exchange before num1 is %v, num2 is %v \n", num1, num2)exchangeNum(num1, num2)fmt.Printf("exchange after num1 is %v, num2 is %v \n", num1, num2)
}

在这里插入图片描述
函数exchangeNum并没有将两个数完成交换。写出这样的代码根本原因是对参数的传递不够了解。下面展开说明。
 我们都知道一个程序在运行时会为其分配一块内存空间,这块内存空间在逻辑上被划分为堆区、栈区、代码区等区块。其中函数执行时会在栈区上为该函数分配一个栈帧,该栈帧在函数调用完毕后会被自动销毁。所以这个栈帧的生命周期是跟随函数的。
用此例来讲,main函数运行时,会产生main函数的栈帧,内部有两个变量num1=100, num2=200,调用exchangeNum的时候,会产生该函数的栈帧,然后该函数接收到两个参数n1=100, n2=200,在exchangeNum函数内,确实完成了这两个数值的交换,函数执行完n1, n2的值交换了。但是函数执行完exchangeNum函数栈帧也一同被销毁了,反观main函数的栈帧中num1 和num2的值依旧是没有发生变化。这也就是为什么执行完exchangeNum函数后两个变量的值并没有被交换的原因。

如何成功交换?

func exchangeNum(n1, n2 *int) {var temp int = *n1*n1 = *n2*n2 = temp
}func main() {var num1 int = 100var num2 int = 200fmt.Printf("exchange before num1 is %v, num2 is %v \n", num1, num2)exchangeNum(&num1, &num2)fmt.Printf("exchange after num1 is %v, num2 is %v \n", num1, num2)
}//方法2
func main() {var num1 int = 100var num2 int = 200num1, num2 = num2, num1
}

注意:

 golang函数不支持函数重载
 golang中支持可变参数 “…”

func test(args... int) { //test函数可以接受多个int类型的参数//在函数内部处理可变参数时将其当作切片来处理for(index := range args) {//相关处理,如打印}
}

 基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改不会影响到原来的值
 以值传递方式的数据类型,如果希望在函数内的改动能都影响到函数外,可以传入变量的地址&,函数内以指针的方式操作变量,从效果上看类似于引用传递

3、Go中函数可以当作数据类型

在Go语言中,函数也是一种数据类型,可以赋值给一个变量,那么该变量就是一个函数类型的变量。通过该变量可以对函数进行调用
在这里插入图片描述
既然函数是一种数据类型,因此在go中,函数可以作为形参并且被调用

func exchangeNum(n1, n2 *int) {var temp int = *n1*n1 = *n2*n2 = temp
}// 定义一个函数,能够接收函数作为形参
func forTest(flag bool, funcExNum func(*int, *int), num1, num2 *int) {if flag {funcExNum(num1, num2)}
}func main() {var num1 int = 100var num2 int = 200fmt.Printf("exchange before num1 is %v, num2 is %v \n", num1, num2)myexchange := exchangeNumfmt.Printf("myexchange 对应的类型是:%T, exchangeNum对应的类型是: %T \n", myexchange, exchangeNum)//此时使用 myexchange(&num1, &num2)等价于exchangeNum(&num1, &num2)myexchange(&num1, &num2)fmt.Printf("exchange after num1 is %v, num2 is %v \n", num1, num2)//此时使用forTest函数再次进行交换 并测试 函数雷总最为形参的使用forTest(true, myexchange, &num1, &num2)fmt.Printf("exchange after forTest: num1 is %v, num2 is %v \n", num1, num2)
}

在这里插入图片描述
为了简化数据类型定义,Go语言支持自定义数据类型
基本语法:type 自定义数据类型 数据类型

func main() {type myInt intvar num1 myInt = 100var num2 int = 40//注意:虽然是别名,但是在编译器看来,//myInt和int并不是同一种数据类型num2 = int(num1)
}
func exchangeNum(n1, n2 *int) {var temp int = *n1*n1 = *n2*n2 = temp
}
type myFun func(*int, *int)
// 定义一个函数,能够接收函数作为形参
func forTest(flag bool, funcExNum myFun, num1, num2 *int) {if flag {funcExNum(num1, num2)}
}

支持对函数返回值命名

//定义一个函数,返回两数之和 和 差
func dealNums(num1 int, num2 int) (int, int) {sum := num1 + num2sub := num1 - num2return sum, sub
}

这样的写法要求返回值与函数返回值类型列表需要一一对应
还有一种写法,显示地指出返回值

func dealNums(num1 int, num2 int) (sum int, sub int) {sub := num1 - num2sum := num1 + num2return
}

注意:这样写在函数内部代码执行完毕后,会将sub的最终值返回给函数返回值类型列表中的sub,sum也是如此

相关文章:

【Golang】函数篇

1、golang函数基本定义与使用 func 函数名 (形参列表) (返回值类型列表) {函数体return 返回值列表 }其中func用于表明这是一个函数,剩下的东西与其他语言的函数基本一致,在定义与使用的时候注意函数名、参数、返回值书写的位置即可。下面使用一个例子…...

在ubuntu上安装ns2和nam(ubuntu16.04)

在ubuntu上安装ns2和nam 版本选择安装ns2安装nam 版本选择 首先,版本的合理选择可以让我们避免很多麻烦 经过测试,ubuntu的版本选择为ubuntu16.04,ns2的版本选择为ns-2.35,nam包含于ns2 资源链接(百度网盘) 链接:https://pan.bai…...

SpringCloudAlibaba之Sentinel介绍

文章目录 1 Sentinel1.1 Sentinel简介1.2 核心概念1.2.1 资源1.2.2 规则 1.3 入门Demo1.3.1 引入依赖1.3.2 集成Spring1.3.3 Spring中资源规则 1.4 Sentinel控制台1.5 核心原理1.5.1 NodeSelectorSlot1.5.2 ClusterBuilderSlot1.5.3 LogSlot1.5.4 StatisticSlot1.5.5 Authority…...

苹果微信聊天记录删除了怎么恢复?果粉原来是这样恢复的

粗心大意删除了微信聊天记录?有时候,一些小伙伴可能只是想要删除一部分聊天记录,但是在进行批量删除时,不小心勾选到了很重要的对话,从而导致记录丢失。 如果这时想找回聊天记录该怎么办?微信聊天记录删除…...

JVM的故事——虚拟机字节码执行引擎

虚拟机字节码执行引擎 文章目录 虚拟机字节码执行引擎一、概述二、运行时栈帧结构三、方法调用 一、概述 执行引擎Java虚拟机的核心组成之一,它是由软件自行实现的,能够执行那些不被硬件直接支持的指令集格式。 对于不同的虚拟机实现,执行引…...

设计模式之适配器与装饰器

目录 适配器模式 简介 角色 使用 优缺点 使用场景 装饰器模式 简介 优缺点 模式结构 使用 使用场景 适配器模式 简介 允许将不兼容的对象包装成一个适配器类,使得其他类可以通过适配器类与原始对象进行交互,从而提高兼容性 角色 目标角色…...

服务器数据恢复- Ext4文件系统分区挂载报错的数据恢复案例

Ext4文件系统相关概念: 块组:Ext4文件系统的空间被划分为若干个块组,每个块组内的结构大致相同。 块组描述符表:每个块组都对应一个块组描述符,这些块组描述符统一放在文件系统的前部,称为块组描述符表。每…...

19-springcloud(上)

一 微服务架构进化论 单体应用阶段 (夫妻摊位) 在互联网发展的初期,用户数量少,一般网站的流量也很少,但硬件成本较高。因此,一般的企业会将所有的功能都集成在一起开发一个单体应用,然后将该单体应用部署到一台服务器…...

前端基础---HTML笔记汇总一

HTML定义 HTML超文本标记语言——HyperText Markup Language。 超文本是什么&#xff1f; 链接标记是什么&#xff1f; 标记也叫标签&#xff0c;带尖括号的文本 标签分类 单标签:只有开始标签&#xff0c;没有结束标签(<br>换行 <hr>水平线 <img> 图像标…...

智汇云舟亮相中国安防工程商集成商大会

智汇云舟亮相中国安防工程商集成商大会&#xff0c;以视频孪生驱动安防行业数字化转型 近日&#xff0c;由中国安全防范产品行业协会指导&#xff0c;永泰传媒主办的中国安防工程商&#xff08;系统集成商&#xff09;大会暨第69届中国安防新产品、新技术成果展示在石家庄圆满…...

使用 Sealos 在离线环境中光速安装 K8s 集群

作者&#xff1a;尹珉。Sealos 开源社区 Ambassador&#xff0c;云原生爱好者。 当容器化交付遇上离线环境 在当今快节奏的软件交付环境中&#xff0c;容器化交付已经成为许多企业选择的首选技术手段。在可以访问公网的环境下&#xff0c;容器化交付不仅能够提高软件开发和交付…...

算法-模拟

1、旋转数组 public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 旋转数组* param n int整型 数组长度* param m int整型 右移距离* param a int整型一维数组 给定数组* return int整型一维数组*/…...

如何通过Instagram群发消息高效拓展客户?

之前小S有跟大家说过关于独立站&#xff0b;Instagram如何高效引流&#xff0c;发现大家都对Instagram的话题挺关注的。Instagram作为全球最受欢迎的社交媒体之一&#xff0c;对于许多商家和营销人员来说&#xff0c;Instagram是一个不可忽视的营销平台&#xff0c;他们可以通过…...

基于springboot实现多线程抢锁的demo

1、本代码基于定时调度和异步执行同时处理&#xff0c;如果只加异步处理&#xff0c;会导致当前任务未执行完&#xff0c;下个任务到点也不会触发执行 Scheduled(fixedRate 50_000)Asyncpublic void testThread() throws Exception{ZkLock lock new ZkLock(zkJob.getZK(), &q…...

Java I/O模型发展以及Netty网络模型的设计思想

Java I/O模型发展以及Netty网络模型的设计思想 I/O模型Java BIOJava NIOJava AIO NIO Reactor网络模型单Reactor单线程模型单Reactor多线程模型主从Reactor多线程模型 Netty通信框架 前言&#xff1a; BIO、NIO的代码实践参考&#xff1a;Java分别用BIO、NIO实现简单的客户端服…...

智能电网时代:数字孪生的崭露头角

随着科技的不断进步&#xff0c;数字孪生已经开始在电力行业崭露头角&#xff0c;为这个关键的行业带来了前所未有的机遇和潜力。本文就带大家了解一下数字孪生在哪些方面为电力行业做出改变&#xff0c;以及未来的创新应用。 首先&#xff0c;数字孪生可以提高电力系统运营效率…...

每日一题 501二叉搜素树中的众数(中序遍历)

题目 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST 满足如下定义&a…...

测试理论与方法----测试流程第三个环节:设计测试用例

测试流程第三个环节&#xff1a;设计测试用例&#xff1a;怎么测<——>测试需求的提取&#xff1a;测什么 ### 5、测试用例 描述&#xff1a;测试用例(TestCase)&#xff1a;是一份关于【具体测试步骤】的文档&#xff0c;是为了达到最佳的测试效果或高效揭露软件中潜藏的…...

C++多态案例2----制作饮品

#include<iostream> using namespace std;//制作饮品的大致流程都为&#xff1a; //煮水-----冲泡-----倒入杯中----加入辅料//本案例利用多态技术&#xff0c;提供抽象类制作饮品基类&#xff0c;提供子类制作茶叶和咖啡class AbstractDrinking {public://煮水//冲水//倒…...

机械零件保养3d模拟演示打消客户购买顾虑

复杂机械的工作运转是复杂的&#xff0c;想要对机械有深度的理解和迭代&#xff0c;必须了解它的运转原理及参数&#xff0c;复杂机械运行原因教学存在着不可视、系统庞杂及知识点多等弊病&#xff0c;3D虚拟展示是基于web3d网页运行的三维页面&#xff0c;可以将复杂机械运行过…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...