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

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

开发者学堂课程【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

相关文章
|
JSON 前端开发 数据格式
四种常见的参数传递方式
四种参数传递方式
206 0
|
1月前
|
设计模式 Python
学习函数的参数传递和返回值
在编写函数时,不可避免地会出现一些错误。通过调试代码,查看参数的值在函数内部的变化以及返回值是否符合预期,有助于更好地理解参数传递和返回值的机制。
|
2月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
68 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
3月前
|
存储 前端开发 JavaScript
前端基础(十一)_函数声明及调用、函数的形参与实参、arguments参数、函数的参数类型、函数中的问题
本文介绍了JavaScript中函数的声明及调用、形参与实参的概念、arguments对象的使用、函数参数的类型以及函数中this的作用。通过示例代码详细解释了函数如何接收参数、如何处理参数个数不匹配的情况,以及函数在不同上下文中this的指向。
29 1
在调用一个函数时传递了一个参数,但该函数定义中并未接受任何参数
在调用一个函数时传递了一个参数,但该函数定义中并未接受任何参数
127 2
|
编译器
详解函数的三种传递方式
详解函数的三种传递方式
206 0
|
编译器 C++
C++函数参数传递的三种方式
C++函数参数传递的三种方式
201 0
|
编译器
传递数组给函数
传递数组给函数
102 0
|
C语言
传递指针给函数
传递指针给函数
64 0

热门文章

最新文章