深入理解Go语言中参数传递中的值、引用及指针之间的区别

news/2024/11/19 23:12:22/

目录

  • 1. 值传递:
  • 2. 引用传递:
  • 3. 指针传递:
  • Go语言中参数传递中的值传递和引用传递的类型区别
  • 1. 值传递的类型:
  • 2. 引用传递的类型:
  • 总结:

引言:
在Go语言中,参数传递是一个重要的概念。了解参数传递中值、引用和指针之间的区别对于编写高效、可靠的代码至关重要。本文将详细讲解Go语言中参数传递中值、引用和指针的概念,并提供相应的代码示例和注解。

1. 值传递:

值传递是指在函数调用时,将实际参数的值复制给形式参数。这意味着在函数内部对形式参数的修改不会影响到实际参数的值。

示例代码:

package mainimport "fmt"func modifyValue(x int) {x = 10
}func main() {num := 5modifyValue(num)fmt.Println(num) // 输出 5
}

注解:
在上述代码中,我们定义了一个函数modifyValue,该函数接受一个整数参数x。在函数内部,我们将x的值修改为10,但是这个修改不会影响到main函数中的num变量的值。

2. 引用传递:

引用传递是指在函数调用时,将实际参数的引用(地址)传递给形式参数。这意味着在函数内部对形式参数的修改会影响到实际参数的值。

示例代码:

package mainimport "fmt"func modifySlice(s []int) {s[0] = 100
}func main() {slice := []int{1, 2, 3, 4, 5}modifySlice(slice)fmt.Println(slice) // 输出 [100, 2, 3, 4, 5]
}

注解:
在上述代码中,我们定义了一个函数modifySlice,该函数接受一个切片参数s。在函数内部,我们将切片的第一个元素修改为100,这个修改会影响到main函数中的slice切片的值。

3. 指针传递:

指针传递是指在函数调用时,将实际参数的地址传递给形式参数。通过使用指针,我们可以在函数内部直接修改实际参数的值。

示例代码:

package mainimport "fmt"func modifyPointer(x *int) {*x = 10
}func main() {num := 5modifyPointer(&num)fmt.Println(num) // 输出 10
}

注解:
在上述代码中,我们定义了一个函数modifyPointer,该函数接受一个整数指针参数x。在函数内部,我们通过解引用指针x并将其赋值为10,这个修改会直接影响到main函数中的num变量的值。

Go语言中参数传递中的值传递和引用传递的类型区别

在Go语言中,参数传递是一个重要的概念。了解哪些类型是值传递,哪些类型是引用传递对于编写高效、可靠的代码至关重要。本文将详细讲解Go语言中参数传递中的值传递和引用传递的类型,并提供相应的代码示例和解释。

1. 值传递的类型:

在Go语言中,以下类型是值传递的:

  • 基本类型:整型、浮点型、布尔型和字符串型等。
  • 数组:包括定长数组和切片。
  • 结构体:包括自定义结构体和匿名结构体。

示例代码:

package mainimport "fmt"func modifyValue(x int, arr [3]int, s []int, person Person) {x = 10arr[0] = 100s[0] = 1000person.Name = "John Doe"
}type Person struct {Name stringAge  int
}func main() {num := 5array := [3]int{1, 2, 3}slice := []int{1, 2, 3}person := Person{Name: "Alice", Age: 25}modifyValue(num, array, slice, person)fmt.Println(num)    // 输出 5fmt.Println(array)  // 输出 [1 2 3]fmt.Println(slice)  // 输出 [1000 2 3]fmt.Println(person) // 输出 {Alice 25}
}

解释:
在上述代码中,我们定义了一个函数modifyValue,该函数接受一个整型参数x、一个数组参数arr、一个切片参数s和一个结构体参数person。在函数内部,我们分别修改了这些参数的值,但是这些修改并不会影响到main函数中的对应变量的值。

2. 引用传递的类型:

在Go语言中,以下类型是引用传递的:

  • 切片slice:切片是引用类型,传递切片时传递的是底层数组的引用。
  • 字典map:字典也是引用类型,传递字典时传递的是字典的引用。
  • 通道channel
  • 接口 interface
  • 指针:指针类型本身就是引用类型,传递指针时传递的是指针的值(地址)。

示例代码:

package mainimport "fmt"func modifySlice(s []int, m map[string]int, p *Person) {s[0] = 100m["key"] = 1000p.Name = "John Doe"
}type Person struct {Name stringAge  int
}func main() {slice := []int{1, 2, 3}m := map[string]int{"key": 10}person := &Person{Name: "Alice", Age: 25}modifySlice(slice, m, person)fmt.Println(slice)  // 输出 [100 2 3]fmt.Println(m)      // 输出 map[key:1000]fmt.Println(person) // 输出 &{John Doe 25}
}

解释:
在上述代码中,我们定义了一个函数modifySlice,该函数接受一个切片参数s、一个字典参数m和一个指针参数p。在函数内部,我们通过修改切片、字典和指针指向的结构体的值,这些修改会直接影响到main函数中的对应变量的值。

总结:

通过本文的讲解,我们深入理解了Go语言中参数传递中的值传递和引用传递的类型。基本类型、数组、结构体是值传递的类型,而切片、字典和指针是引用传递的类型。在编写Go代码时,根据需求选择适当的参数传递方式,能够提高代码的性能和可维护性。
我们深入理解了Go语言中参数传递中值、引用和指针之间的区别。值传递是将实际参数的值复制给形式参数,引用传递是将实际参数的引用传递给形式参数,而指针传递是将实际参数的地址传递给形式参数。在编写Go代码时,根据需求选择适当的参数传递方式,能够提高代码的性能和可维护性。


http://www.ppmy.cn/news/981565.html

相关文章

7 | 电影数据

文章目录 使用Python爬取电影数据并保存为CSV文件完整代码使用Python爬取电影数据并保存为CSV文件 Python爬虫是一种获取网络数据的有效方式。在这篇博客中,我们将使用Python中的requests库来获取网页内容,lxml库来解析网页内容,然后将得到的数据保存为CSV文件。 第一步:…

VUE使用docxtemplater导出word(带图片) 踩坑 表格循环空格 ,canvas.toDataURL图片失真模糊问题

参考:https://www.codetd.com/article/15219743 安装 // 安装 docxtemplater npm install docxtemplater pizzip --save // 安装 jszip-utils npm install jszip-utils --save // 安装 jszip npm install jszip --save // 安装 FileSaver npm install file-save…

MySQL数据库关于表的一系列操作

MySQL中的数据类型 varchar 动态字符串类型(最长255位),可以根据实际长度来动态分配空间,例如:varchar(100) char 定长字符串(最长255位),存储空间是固定的,例如&#…

【Nodejs】操作mongodb数据库

1.简介 Mongoose是一个让我们可以通过Node来操作MongoDB的模块。Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能。在大多数情况下,它被用来把结构化的模式应用到一个MongoDB集合,并…

java中线程池、Lambda表达式、file类、递归

线程池: 在多线程的使用过程中,会存在一个问题:如果并发的线程数量很多,并且每个线程都执行一个时间很短的任务就结束,这样频繁的创建线程就会大大降低系统的效率,因为线程的创建和销毁都需要时间。 线程…

IPv6 over IPv4

IPv6 over IPv4隧道简介 IPv6 over IPv4隧道可实现IPv6网络孤岛之间通过IPv4网络互连。由于IPv4地址的枯竭和IPv6的先进性,IPv4过渡为IPv6势在必行。因为IPv6与IPv4的不兼容性,所以需要对原有的IPv4设备进行替换。但是如果贸然将IPv4设备大量替换所需成…

[元带你学: eMMC协议 29] eMMC 断电通知(PON) | 手机平板电脑断电通知

依JEDEC eMMC及经验辛苦整理,原创保护,禁止转载。 专栏 《元带你学:eMMC协议》 内容摘要 全文 2000 字, 主要内容 前言 断电通知是什么? 断电通知过程

拦截Bean使用之前各个时机的Spring组件

拦截Bean使用之前各个时机的Spring组件 之前使用过的BeanPostProcessor就是在Bean实例化之后,注入属性值之前的时机。 Spring Bean的生命周期本次演示的是在Bean实例化之前的时机,使用BeanFactoryPostProcessor进行验证,以及在加载Bean之前进…