函数参数的传递方式 | 学习笔记

简介: 简介:快速学习函数参数的传递方式

开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map :函数参数的传递方式】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/625/detail/9612


函数参数的传递方式

 

基本内容

一、 基本介绍

二、 两种传递方式

三、 值类型和引用类型

四、 值传递和引用传递使用特点


一、基本介绍

函数注意事项和使用细节中,讲了值类型和引用类型了,这个是重难点,再系统总结一下,在开发的时候会经常用到这个知识点,值类型参数默认就是值传递,而引用类型参数默认就是引用传递。

 

二、两种传递方式

1、 值传递

比如说之前的基本数据类型就是值传递,所谓值传递就是在传递参数的时候进行了一个子拷贝,这个就是值传递。

2、 引用传递

引用传递就是一个地址。其实,值传递和引用传递的本质是一样的。不管是值传递还是引用传递,传递给函数的都是变量的副本。不同的是:

值传递的是值的拷贝(比如说传了一个整数6,传过去给函数之后,函数会得到一个新的6,是一个值)。

引用传递的是地址的拷贝(比如说指针,如果希望函数内的变量能够修改函数外的变量就可以用引用传递,使用指针传递其实就是引用传递)。

一般来说,地址拷贝效率高。因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低。

image.png

在 test03 之中传了个地址过去,传了地址给指针,指针其实是引用传递类型,指针在传地址的时候也进行了一个拷贝,也传递了一个具体的值,只是这个值不是20具体的数据内容,而是一个地址。

// n1就是*int 类型

func teste3(n1 *int) {

*n1 = *n1 + 10

fmt.Println( "teste3()n1= ", *n1) // 30

}

func main() {

//num := 20

//teste2(num)

//fmt.Println("main() num= ", num)

num := 20

teste3(&num)

fmt.Println( "main() num= ", num)// 30

}

假设 num 是一个数,拷贝一个数过去和拷贝一个地址过去效率肯定不一样,地址数据量比较小,很快就能传过去,结构体的内容量很大,结构体默认也是子拷贝,用子拷贝过去,就会产生一个很大的数,效率就比较低,如果传递的是一个结构体的地址,效率就会高。


三、值类型和引用类型

1、 值类型: 基本数据类型 int 系列, float 系列, bool, string 、数组和结构体 struct。

2、 引用类型: 指针、slice 切片、map、管道 chan、interface 等都是引用类型。

3、 暂时引用传递就讲了一个指针,需要非常清楚的认识哪些是值传递哪些是引用传递,这样在做开发的时候效率更高。


四、值传递和引用传递使用特点

在讲变量的时候讲了值传递和引用传递的类型,在此继续回顾一下,这个知识点非常重要。

1、 值类型默认是值传递,变量直接存储值,内存通常在栈中分配

【案例:画出示意图】

num=100,num 直接和这个值放到一起,如果 num 取地址,这个地址就是值所对应的地址。

image.png

2、 引用类型默认是引用传递,变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由 GC 来回收。

【案例,并画出示意图】

有个引用类型 ref ,并没有直接指向这个值,它是先指向一个地址,这个地址再指向这个值,这是引用传递的一个特点。

image.png

3、 如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果上看类似引用。在详解函数使用的注意事项的第6点讲过。

image.png

相关文章
|
移动开发 运维 监控
掌握Linux运维利器:查看CPU和内存占用,轻松解决性能问题!
掌握Linux运维利器:查看CPU和内存占用,轻松解决性能问题!
847 0
|
关系型数据库 分布式数据库 数据库
|
机器学习/深度学习 数据挖掘 开发者
|
存储 Python
Python函数参数传递
Python函数参数传递
397 1
|
存储 人工智能 搜索推荐
揭秘LangChain+RAG如何重塑行业未来?保姆级实战演练,解锁大模型在各领域应用场景的神秘面纱!
【10月更文挑战第4天】随着AI技术的发展,大型语言模型在各行各业的应用愈发广泛,检索增强生成(RAG)技术成为推动企业智能化转型的关键。本文通过实战演练,展示了如何在LangChain框架内实施RAG技术,涵盖金融(智能风控与投资决策)、医疗(辅助诊断与病历分析)及教育(个性化学习推荐与智能答疑)三大领域。通过具体示例和部署方案,如整合金融数据、医疗信息以及学生学习资料,并利用RAG技术生成精准报告、诊断建议及个性化学习计划,为企业提供了切实可行的智能化解决方案。
558 5
|
机器学习/深度学习 决策智能
深度学习中的对抗性训练
在这篇技术性文章中,我们将深入探讨深度学习中的对抗性训练。这种训练方法通过引入对抗性样本来提高模型的鲁棒性和泛化能力。文章将从对抗性训练的基本概念、原理以及实现方法等方面进行详细介绍,并结合实际案例分析其在实际应用中的效果和挑战。通过对这一主题的探讨,希望能够为读者提供有益的技术参考和启示。
686 1
|
定位技术
ArcGIS投影:地理坐标系转为投影坐标系
本文介绍在ArcMap软件中,对矢量图层或栅格图层进行投影(即将地理坐标系转为投影坐标系)的原理与操作方法~
1633 1
ArcGIS投影:地理坐标系转为投影坐标系
|
缓存 安全 前端开发
Cloudflare
【7月更文挑战第13天】Cloudflare
767 5
|
前端开发 iOS开发
通过css内修改input框placeholder样式
通过css内修改input框placeholder样式
360 1
|
算法 安全 开发者
Copilot使用技巧
Copilot使用技巧
430 1
Copilot使用技巧