温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Go中数组传参的方式有哪些

发布时间:2023-03-08 11:34:12 来源:亿速云 阅读:82 作者:iii 栏目:开发技术

这篇文章主要介绍“Go中数组传参的方式有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go中数组传参的方式有哪些”文章能帮助大家解决问题。

初学Golang,数组传参问题就是把我整不会了,以前我们使用c语言进行数组传参时是这样传递的,直接传递数组的起始地址即可。

Go中数组传参的方式有哪些

而在go中数组传参我们以以下两种方式进行传递,这里我直接贴出go代码,文中有注释:

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中数组传参的方式有哪些

至此,我们发现,通过数组名传递参数方式并不能修改原数组,而通过切片方式传递能完成数组修改,这是因为,和其他语言不同,go语言在将数组名作为函数参数的时候,参数传递即是对数组的复制。在形参中对数组元素的修改都不会影响到数组元素原来的值。而在使用slice作为函数参数时,进行参数传递将是一个地址拷贝,即将底层数组的内存地址复制给参数slice。这时,对slice元素的操作就是对底层数组元素的操作。采用指针方式进行传递就是传递的引用,对这个引用指向的地址的内容进行修改也会影响原数组的值。

总结:在Go语言中函数的参数有两种传递方式,按值传递和按引用传递。Go默认使用按值传递来传递参数,也就是传递参数的副本。在函数中对副本的值进行更改操作时,不会影响到原来的变量。按引用传递其实也可以称作"按值传递",只不过该副本是一个地址的拷贝,通过它可以修改这个值所指向的地址上的值。

Go语言中,在函数调用时,引用类型(slice、map、interface、channel)都默认使用引用传递。

数组传递时的一些缺点

一般情况下,传递指针的消耗比传递副本的少,尤其是当数组特别大时。具体原因是:

  • 值传递需要完整的复制初始数组并将这份拷贝放到栈中,这将耗费大量运行时间,因而值传递方式的效率比较低。

  • 初始数组的拷贝需要占用额外的内存空间(栈中的内存)

  • 编译程序需要专门产生一部分用来复制初始数组的代码,这将使程序变大。

关于“Go中数组传参的方式有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

go
AI