当前位置: 首页 > 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;可以将复杂机械运行过…...

公考教父级教学,不同阶段学员都能适配

备考省考面试&#xff0c;选对讲师真的能少走80%的弯路&#xff01;最近体验了初心教育钟晓红老师的面试课&#xff0c;彻底被这位“公考面试教父”的实力折服。作为公考面试讲师导师&#xff0c;钟老师的课适配不同阶段学员&#xff0c;整体通过率还在行业里断层领先&#xff…...

AgentCPM深度研报助手企业级部署架构设计:高并发下的性能与成本优化

AgentCPM深度研报助手企业级部署架构设计&#xff1a;高并发下的性能与成本优化 最近和几个做金融科技的朋友聊天&#xff0c;他们都在头疼一件事&#xff1a;公司内部的分析师、研究员越来越多地依赖AI来辅助撰写行业研报&#xff0c;但现有的AI服务要么太贵&#xff0c;要么…...

基于python的本地选择图像接入百度云api的图像识别项目

项目灵感来源于老师布置的任务。怎么感觉老师这个题目也是ai生成的~。~ 题目&#xff1a;基于 AI 视觉的本地图像分析脚本 任务要求&#xff1a; 请使用 Python 编写一个通用的图像分析脚本&#xff0c;具体流程需满足以下三个步骤&#xff1a; * 本地选图&#xff1a;程序运…...

Llama-3.2V-11B-cot效果展示:漫画分镜连续性与叙事逻辑分析

Llama-3.2V-11B-cot效果展示&#xff1a;漫画分镜连续性与叙事逻辑分析 1. 模型能力概览 Llama-3.2V-11B-cot是基于Meta多模态大模型开发的专业级视觉推理工具&#xff0c;特别针对漫画分镜分析与叙事逻辑理解进行了深度优化。该模型在双卡4090环境下展现出强大的视觉推理能力…...

惠普tank2606,tank1005,屏幕显示ER 08,亮黄灯,加了碳粉问题依旧,遇到这个ER08报错别慌,更加别信维修店,维修店报价400块,这个软件2分钟修好,亲测完美修好,超级推荐。

下载&#xff1a;点这里下载 备用&#xff1a;https://pan.baidu.com/s/1jnWFzxqMMKBMDChJEfvBng?pwd0000 惠普tank2606,tank1005屏幕显示ER 08&#xff0c;亮黄灯&#xff0c;加了碳粉问题依旧&#xff0c;遇到这个ER08报错别慌&#xff0c;更加别信维修店&#xff0c;维修…...

5大场景落地指南:企业级语音识别服务从部署到优化全攻略

5大场景落地指南&#xff1a;企业级语音识别服务从部署到优化全攻略 【免费下载链接】whisper-asr-webservice OpenAI Whisper ASR Webservice API 项目地址: https://gitcode.com/gh_mirrors/wh/whisper-asr-webservice 【项目核心价值定位】解决3大语音识别痛点的开源…...

低功耗psram在嵌入式存储领域的作用

在嵌入式存储领域&#xff0c;低功耗PSRAM&#xff08;伪静态随机存取存储器&#xff09;正逐渐成为智能穿戴、物联网设备等对功耗和体积敏感应用的理想选择。那么&#xff0c;PSRAM究竟有什么作用&#xff1f;为什么它能在低功耗场景中脱颖而出&#xff1f; 1.psram是什么 PS…...

ai赋能开发:让快马平台智能助手教你如何用最新jdk特性重构旧代码

今天在维护一个老项目时&#xff0c;发现了一段基于JDK 8的用户过滤排序代码。作为一个持续关注Java新特性的开发者&#xff0c;我决定用最新JDK 17的特性来重构这段代码。正好最近在用InsCode(快马)平台做项目&#xff0c;发现它的AI辅助功能特别适合用来做这种代码现代化改造…...

终极硬件指纹伪装指南:如何用EASY-HWID-SPOOFER保护你的数字隐私

终极硬件指纹伪装指南&#xff1a;如何用EASY-HWID-SPOOFER保护你的数字隐私 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER 在数字时代&#xff0c;你的电脑硬件指纹就像数字世界…...

Markdown 使用指南

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...