时间:2023-03-09来源:系统城装机大师作者:佚名
初学Golang,数组传参问题就是把我整不会了,以前我们使用c语言进行数组传参时是这样传递的,直接传递数组的起始地址即可。
而在go中数组传参我们以以下两种方式进行传递,这里我直接贴出go代码,文中有注释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
package main import "fmt" func testArr01(arr [] int ) { //形参未指定大小 arr[ 0 ]++ } func testArr02(arr [ 5 ] int ) { //形参指定大小 arr[ 0 ]++ } func testArr03(arr *[ 5 ] int ) { //使用指针方式,也就是引用传递 arr[ 0 ]++ } func main() { var arr = [ 5 ] int { 0 , 2 , 3 , 17 , 50 } testArr01(arr[:]) //切片方式传递(常用) for i := 0 ; i < len (arr); i++ { fmt.Printf( "%d " , arr[i]) } fmt. Println () testArr02(arr) //数组名方式传递,此时传递的是副本,并不会改变原数组 for i := 0 ; i < len (arr); i++ { fmt.Printf( "%d " , arr[i]) } fmt. Println () testArr03(&arr) //指针方式传递,会改变原数组 for i := 0 ; i < len (arr); i++ { fmt.Printf( "%d " , arr[i]) } fmt. Println () } |
运行结果:
至此,我们发现,通过数组名传递参数方式并不能修改原数组,而通过切片方式传递能完成数组修改,这是因为,和其他语言不同,go语言在将数组名作为函数参数的时候,参数传递即是对数组的复制。在形参中对数组元素的修改都不会影响到数组元素原来的值。
而在使用slice作为函数参数时,进行参数传递将是一个地址拷贝,即将底层数组的内存地址复制给参数slice。这时,对slice元素的操作就是对底层数组元素的操作。采用指针方式进行传递就是传递的引用,对这个引用指向的地址的内容进行修改也会影响原数组的值。
总结:在Go语言中函数的参数有两种传递方式,按值传递和按引用传递。Go默认使用按值传递来传递参数,也就是传递参数的副本。在函数中对副本的值进行更改操作时,不会影响到原来的变量。按引用传递其实也可以称作"按值传递",只不过该副本是一个地址的拷贝,通过它可以修改这个值所指向的地址上的值。
Go语言中,在函数调用时,引用类型(slice、map、interface、channel)都默认使用引用传递。
数组传递时的一些缺点
一般情况下,传递指针的消耗比传递副本的少,尤其是当数组特别大时。具体原因是:
2024-07-16
如何使用 Go 依赖库管理器修复损坏的依赖项?2024-07-07
Java框架如何简化代码的调试过程2023-03-17
Python 使用tf-idf算法计算文档关键字权重并生成词云的方法有这么一段代码,可以先看一下有没有什么问题,作用是输入一段json字符串,反序列化成map,然后将另一个inputMap的内容,merge进这个map 1 2 3 4 5 6 7 8 9 10 11 12 13 14...
2023-03-15
由于数据库的类型为Data 类型,所以插入数据库的时候我先把前端传入的string类型的时间转为Time 再插入。 Go 提供了两种插入的方式,即time.Parse 和 time.ParseInLocation 。两种方式,他们的差异比较大。...
2023-03-09