【Go】函数的使用

目录

函数返回多个值

init函数和import

init函数

main函数

函数的参数

值传递

引用传递(指针)


函数返回多个值

用法如下:

package main

import (
	"fmt"
	"strconv"
)

// 返回多个返回值,无参数名
func MultFunc1(a int, b int) (int, string) {
	a = a + 1
	b = b + 1
	//数字转字符串
	itoa := strconv.Itoa(b)
	return a, itoa

}

// 返回多个返回值,有参数名
func MultFunc2(a int, b int) (r1 int, r2 int) {
	//形参有默认值 是0
	fmt.Println("形参r1: ", r1, "r2: ", r2)
	r1 = a + 1
	r2 = b + 1
	return

}

func MultFunc3(a int, b int) (int, int) {
	a = a + 1
	b = b + 1
	return 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 lib1

import "fmt"

func init() {
	fmt.Print("我是lib1")
}

func Lib1Test() {
	fmt.Println("lib1Test")
}

Lib2.go

package lib2

import (
	"fmt"
)

func init() {
	fmt.Print("我是Lib2")
}
func Lib2Test() {
	fmt.Println("lib2Test")
}

main.go

注意:如果文中没有使用,就需要家一个_

package main

import (
	"fmt"
	"goProject/aaa/lib1"
	"goProject/aaa/lib2"
)

func init() {
	fmt.Print("我是Lib3.go")
}

func main() {
	lib1.Lib1Test()
	lib2.Lib2Test()

}

注意看打印的结果

输出的顺序与我们上面图给出的顺序是一致的

函数的参数

函数如果使用参数,该变量可称为函数的形参

形参就像是定义在函数体内的局部变量

调用函数,可以通过两种方式传递参数:

值传递

值传递是指在调用函数的时候将实际的参数复制一份传递到函数中,这样在函数中如果对参数进行修改,则不会影响到实际的参数。

默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。

下面使用一个经典的案例:两数交换

package main

import "fmt"

// 值传递
func Swap1(a int, b int) {
	var temp = a
	a = b
	b = temp

}

// 引用传递
func Swap2(a *int, b *int) {
	var temp = *a
	*a = *b
	*b = temp

}

func main() {
	a := 1
	b := 2
	Swap1(a, b)
	fmt.Println("值传递 a=", a, "b=", b)
	Swap2(&a, &b)
	fmt.Println("引用传递 a=", a, "b=", b)
}

执行结果如下:

第一种值传递的方式交换失败,是因为副本拷贝

第一种是引用传递,他是传递地址,那么引出了指针

引用传递(指针)

指针在C++中有用到。引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

详情,可以去看看C++,我也去看看!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java项目:基于SSM框架实现的农家乐信息管理平台含前后台【ssm+B/S架构+源码+数据库+答辩PPT+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的农家乐信息管理平台 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功…

01:简易的电动车防盗报警器

简易的电动车防盗报警器 1、震动传感器模块的使用2、使用震动传感器模块控制继电器开关3、433M无线发射接收模块的使用 需要材料: 1、51单片机 2、震动传感器模块 3、继电器模块 4、高功率喇叭 5、433M无线发射接收模块 6、弱干杜邦线 1、震动传感器模块的使用 接好…

安全求交集PSI

安全求交集定义 求交集的PSI:交集可以被两方看见或其中一方看见,非交集进行保护有两方的PSI半诚实的PSI:攻击者要严格遵守协议,在此基础上得到他人的秘密是做不到的 Two-Party Semi-Honest PSI 挑战一:隐藏非交集元素…

Day65 代码随想录打卡|回溯算法篇---组合总和II

题目(leecode T40): 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含…

硕博电子移动控制器在无人驾驶卡车上的应用

传统港口行业一直是一个典型的劳动密集型行业,以前,集装箱的每次起吊操作需要多人配合,包括操作员、指挥手、理货员等至少7名现场工作人员。传统码头设施陈旧,重型设备难以更新换代。而且,港口还经常受到天气状况的影响…

GraphRAG——一个基于图的检索增强生成的开源项目【送源码】

GraphRAG 最近几天,微软团队开源了GraphRAG,这是一种基于图(Graph)的检索增强生成方法。 先说说RAG吧,检索增强生成,相当于是从一个给定好的知识库中进行检索,接入LLM模型,让模型生…

ByteMD富文本编辑器的vue3配置

Git地址:GitHub - bytedance/bytemd: ByteMD v1 repository 控制面板输入 npm install bytemd/vue-next 下载成功后在src/main.ts中引用 import "bytemd/dist/index.css";引入后保存,下面是一些插件,比如说我用到gmf和hightLight&…

数据类型及数据块认知

西门子STEP7编程语言 梯形图(LAD) 功能块图(FBD) 语句表(STL) 其中梯形图和功能块图可以相互转换 CPU常用数据区 信号输入区 I 信号输出区 Q 程序中表现形式,IX.X/QX.X;IWX/QWX-访问的是CPU输出输入过程映像区 另一种形式IWX:P/QWX:P-访问的是信号端口地址&#xf…

Transformer-LSTM预测 | Matlab实现Transformer-LSTM时间序列预测

Transformer-LSTM预测 | Matlab实现Transformer-LSTM时间序列预测 目录 Transformer-LSTM预测 | Matlab实现Transformer-LSTM时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现Transformer-LSTM时间序列预测,Transformer-LSTM&#xf…

如何评价Flutter?

哈喽,我是老刘 我们团队使用Flutter已经快6年了。 有很多人问过我们对Flutter的评价。 今天在这里回顾一下6年前选择Flutter时的原因,以及Flutter在这几年中的实际表现如何。 选择Flutter时的判断 1、性能 最开始吸引我们的就是其优秀的性能。 特别是…

【SQL】做项目时用到的语句整理(去重/多表关联)

1. 对日期去重(groupby) 需要:新建一张表,对原来表中的某个列(href)进行去重,并按照最新的日期进行排版 适用:如果有一张表,我们重复往里面存入数据,有一些除了日期以外&#xff0…

符号同步、定时同步和载波同步

符号同步、定时同步和载波同步是通信系统中重要的同步技术,它们各自承担着不同的功能和作用。以下是对这三种同步技术的详细解释: 符号同步 定义: 符号同步,也称为定时恢复或时钟恢复,是指在数字通信系统中&#xff…

Java字符串(String、字符串拼接、原理)

文章目录 一、String字符串1.1创建方式【直接赋值、new一个对象】1.1.1 使用字符串字面值直接赋值:(1)字符串字面量创建String对象的转换过程(2)一些方法(3)说明 1.1.2 使用new关键字创建字符串…

MySQL:TABLE_SCHEMA及其应用

MySQL TABLE_SCHEMA及其应用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/ar…

285个地级市出口产品质量及技术复杂度(2011-2021年)

出口产品质量与技术复杂度:衡量国家竞争力的关键指标 出口产品质量是衡量国内企业生产的产品在国际市场上竞争力的重要标准。它不仅要求产品符合国际标准和目标市场的法律法规,而且需要保证产品质量的稳定性和可靠性。而出口技术复杂度则进一步体现了一…

龙迅LT8641UXE HDMI四进一出切换开关,支持标准HDMI 2.0内置MCU

龙迅LT8641UXE描述: Lontium LT8641UX HDMI2.0开关具有符合HDMI2.0/1.4规范的4:1开关,最大6Gbps高速数据速率,自适应均衡RX输入和预先强调的TX输出支持长电缆应用,没有XTAL板上节省BOM成本。LT8641UX HDMI2.0开关自动…

C++之goto陈述

关键字 goto用于控制程式执行的顺序&#xff0c;使程式直接跳到指定标签(lable) 的地方继续执行。 形式如下 标签可以是任意的识别字&#xff0c;后面接一个冒号。 举例如下 #include <iostream>int main() {goto label_one;label_one: {std::cout << "Lab…

数字人直播时代来了!数字人直播系统搭建,AI虚拟数字人直播系统源码部署

数字人直播系统这是一种利用人工智能技术&#xff0c;实现自动化生成真实人物直播销售商品的综合性解决方案。 一、目前数字人直播支持的平台&#xff1a; 抖音、快手、视频号、小红书、淘宝、支付宝生活号、TikTok、阿里国际站等。 技术栈 数据库&#xff1a;mysql5.7 技术搭…

搜维尔科技:OptiTrack在NAB2024展示了一系列业界领先的媒体技术

广泛的显示和动作捕捉跟踪技术组合涵盖无与伦比的室内和室外 LED 解决方案、前沿技术演示以及最新的软件和硬件产品 可视化技术领域的全球领导者 Planar及其附属公司 3D 跟踪系统的全球领导者OptiTrack宣布&#xff0c;两家公司将在 2024 年全国广播协会 (NAB) 展会上展示其最全…

新火种AI|OpenAI的CEO又有新动作?这次他成立了AI健康公司

作者&#xff1a;一号 编辑&#xff1a;美美 AI技术即将改变医疗健康市场。 就在前两天&#xff0c;人工智能和医疗健康领域迎来了一个重要时刻。OpenAI的CEO萨姆阿尔特曼&#xff08;Sam Altman&#xff09;与Thrive Global的CEO阿里安娜赫芬顿&#xff08;Arianna Huffing…