【Go】函数的使用
目录
函数返回多个值
init函数和import
init函数
main函数
函数的参数
值传递
引用传递(指针)
函数返回多个值
用法如下:
package mainimport ("fmt""strconv"
)// 返回多个返回值,无参数名
func MultFunc1(a int, b int) (int, string) {a = a + 1b = b + 1//数字转字符串itoa := strconv.Itoa(b)return a, itoa}// 返回多个返回值,有参数名
func MultFunc2(a int, b int) (r1 int, r2 int) {//形参有默认值 是0fmt.Println("形参r1: ", r1, "r2: ", r2)r1 = a + 1r2 = b + 1return}func MultFunc3(a int, b int) (int, int) {a = a + 1b = b + 1return a, b}func main() {var a, b = MultFunc1(1, 2)fmt.Println("a=", a, "b=", b)var c, d = MultFunc2(3, 4)fmt.Println("c=", c, "d=", d)var e, f = MultFunc3(5, 6)fmt.Println("e=", e, "f=", f)
}
形参是有默认值的 0 ""(空串) false

init函数和import
init函数
init函数可以在package main 中,可在其他package中,可在同一个package中出现多次
main函数
main 函数只能在package main中。
执行顺序
golang中有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能用于package main)。这两个函数在定义的时候不能有任何的返回值和参数
虽然package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说都是不方便的,所以建议用户在一个package中每个文件只写一个init函数。
程序的初始化和执行都始于main包
如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。
当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。
等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。下图详细地解释了整个执行过程:

测试例子
代码结构如下

Lib1.go
package lib1import "fmt"func init() {fmt.Print("我是lib1")
}func Lib1Test() {fmt.Println("lib1Test")
}
Lib2.go
package lib2import ("fmt"
)func init() {fmt.Print("我是Lib2")
}
func Lib2Test() {fmt.Println("lib2Test")
}
main.go
注意:如果文中没有使用,就需要家一个_
package mainimport ("fmt""goProject/aaa/lib1""goProject/aaa/lib2"
)func init() {fmt.Print("我是Lib3.go")
}func main() {lib1.Lib1Test()lib2.Lib2Test()}

注意看打印的结果
输出的顺序与我们上面图给出的顺序是一致的
函数的参数
函数如果使用参数,该变量可称为函数的形参
形参就像是定义在函数体内的局部变量
调用函数,可以通过两种方式传递参数:
值传递
值传递是指在调用函数的时候将实际的参数复制一份传递到函数中,这样在函数中如果对参数进行修改,则不会影响到实际的参数。
默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。
下面使用一个经典的案例:两数交换
package mainimport "fmt"// 值传递
func Swap1(a int, b int) {var temp = aa = bb = temp}// 引用传递
func Swap2(a *int, b *int) {var temp = *a*a = *b*b = temp}func main() {a := 1b := 2Swap1(a, b)fmt.Println("值传递 a=", a, "b=", b)Swap2(&a, &b)fmt.Println("引用传递 a=", a, "b=", b)
}
执行结果如下:

第一种值传递的方式交换失败,是因为副本拷贝
第一种是引用传递,他是传递地址,那么引出了指针
引用传递(指针)
指针在C++中有用到。引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
详情,可以去看看C++,我也去看看!
相关文章:
【Go】函数的使用
目录 函数返回多个值 init函数和import init函数 main函数 函数的参数 值传递 引用传递(指针) 函数返回多个值 用法如下: package mainimport ("fmt""strconv" )// 返回多个返回值,无参数名 func Mu…...
宝塔面板运行Admin.net框架
准备 宝塔安装 .netcore安装 Admin.net框架发布 宝塔面板设置 完结撒花 1.准备 服务器/虚拟机一台 系统Windows server / Ubuntu20.04(本贴使用的是Ubuntu20.04版本系统) Admin.net开发框架 先安装好服务器系统,这里就不做安装过程描述了&…...
Javaweb11-Filter过滤器
Filter过滤器 1.Filter的基本概念: 在Java Servlet中,Filter接口是用来处理HttpServletRequest和HttpServletResponse的对象的过滤器。主要用途是在请求到达Servlet之前或者响应离开Servlet之前对请求或响应进行预处理或后处理。 2.Filter常见的API F…...
【AI-7】CUDA
CUDA(Compute Unified Device Architecture)是NVIDIA公司开发的一种并行计算平台和编程模型,使开发者能够利用NVIDIA GPU的强大计算能力来加速各种应用。以下是关于CUDA的详细介绍: CUDA的特点 并行计算:CUDA允许开发…...
ctfshow-web入门-文件上传(web164、web165)图片二次渲染绕过
web164 和 web165 的利用点都是二次渲染,一个是 png,一个是 jpg 目录 1、web164 2、web165 二次渲染: 网站服务器会对上传的图片进行二次处理,对文件内容进行替换更新,根据原有图片生成一个新的图片,这样…...
基于实现Runnable接口的java多线程
Java多线程通常可以通过继承Thread类或者实现Runnable接口实现。本文主要介绍实现Runnable接口的java多线程的方法, 并通过ThreadPoolTaskExecutor调用执行,以及应用场景。 一、应用场景 异步、并行、子任务、磁盘读写、数据库查询、网络请求等耗时操作等。 以下…...
如何在uniapp中使用websocket?
websocket是我们经常使用到的接口,通常用于即时通讯以及K线图这种需要实时更新数据的业务需求上,传统的restful接口虽然可以满足,但是你需要轮询,这就要额外写一堆代码,不是很方便,用websocket就简单很多,我们来看代码 第一步定义全局常量、变量 const config = {host…...
PCL 点云PFH特征描述子
点云PFH特征描述子 一、概述1.1 概念1.2 算法原理二、代码实现三、结果示例一、概述 1.1 概念 点特征直方图PFH(Point Feature Histograms)描述子:用于表示点云中每个点的局部几何形状信息,它是一种直方图描述子,包括了点云的法线方向和曲率信息,PFH描述子可以帮助区分不同…...
linux程序安装-编译-rpm-yum
编译安装流程步骤详解 识途老码 | Linux编译安装程序 编译安装概览 编译安装是从软件的源代码构建到最终安装的过程,它允许用户根据自身的需求和系统的环境来自定义软件的配置和功能。相对于二进制安装,编译安装提供了更高的灵活性和控制能力,但同时也要求用户具备一定的…...
【网络协议】PIM
PIM 1 基本概念 PIM(Protocol Independent Multicast)协议,即协议无关组播协议,是一种组播路由协议,其特点是不依赖于某一特定的单播路由协议,而是可以利用任意单播路由协议建立的单播路由表完成RPF&…...
Redis 中的跳跃表(Skiplist)基本介绍
Redis 中的跳跃表(Skiplist)是一种用于有序元素集合的快速查找数据结构。它通过一个多级索引来提高搜索效率,能够在对数时间复杂度内完成查找、插入和删除操作。跳跃表特别适用于实现有序集合(sorted set)的功能&#…...
C语言编译和编译预处理
1.编译预处理 • 编译是指把高级语言编写的源程序翻译成计算机可识别的二进制程序(目标程序)的过程,它由编译程序完成。 • 编译预处理是指在编译之前所作的处理工作,它由编译预处理程序完成 在对一个源程序进行编译时࿰…...
ahb 总线的一些思考
1. 如何处理对不存在地址的访问? 当主设备试图访问内存映射中不存在的地址时,系统需要处理这一情况以避免错误或未定义行为。通常通过使用默认从设备或错误响应机制来管理。具体如下: 默认从设备:默认从设备响应对未定义或不存在…...
spark shuffle写操作——SortShuffleWriter
写入的简单流程: 1.生成ExternalSorter对象 2.将消息都是插入ExternalSorter对象中 3.获取到mapOutputWriter,将中间产生的临时文件合并到一个临时文件 4.生成最后的data文件和index文件 可以看到写入的重点类是ExternalSorter对象 ExternalSorter 基…...
ESP32CAM物联网教学12
ESP32CAM物联网教学12 MicroPython 视频服务 小智希望能在MicroPython中实现摄像头的视频服务,就像官方示例程序CameraWebServer那样。 下载视频服务驱动库 小智通过上网搜索,发现相关的教学材料还不少,并且知道有人已经写出了视频服务的驱…...
【C++精华铺】12.STL list模拟实现
1.序言 STL (Standard Template Library)是C标准库中的一个重要组件,提供了许多通用的数据结构和算法。其中,STL list是一种带头双向链表容器,可以存储任意类型的元素。 list的特点包括: 双向性:list中的元素可以根据需…...
ChatGPT Mac App 发布!
2024 年 6 月,OpenAI 的大语言模型 ChatGPT 的 Mac 客户端与 ChatGPT-4o 一起发布了。ChatGPT Mac 户端可以让用户直接在 Mac 电脑上使用 ChatGPT 进行对话。它提供了一个简单易用的用户界面,用户可以在其中输入文本或语音指令,并接收模型生成…...
ACE之ACE_Time_Value
简介 ACE_Time_Value在ACE中表示时间,集成不同平台的时间 结构 #mermaid-svg-dGoKn1R7GicabUif {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dGoKn1R7GicabUif .error-icon{fill:#552222;}#mermaid-…...
[论文笔记] 自对齐指令反翻译:SELF-ALIGNMENT WITH INSTRUCTION BACKTRANSLATION
https://arxiv.org/pdf/2308.06259 这篇论文介绍了一种名为“指令反向翻译”(instruction backtranslation)的方法,用于通过自动标记人类书写的文本和相应的指令来构建高质量的指令跟随语言模型。这里是一个通俗易懂的解释: 一、背景 通常,训练一个高质量的指令跟随语言…...
算术运算符. 二
# 表达式 # 操作数和运算符组成 比如 11 # 作用:表达式可以求值,也可以给变量赋值。 # Python算术运算符: # - * / % //(整除:向下取整) ** print(10 4) # 14 print(10 - 4) # 6 print(10 * 4) # 40 …...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
