为了账号安全,请及时绑定邮箱和手机立即绑定

关于Go语言中数组的参数传递问题

关于Go语言中数组的参数传递问题

富国沪深 2019-03-29 10:59:04
一个很微妙的一个问题。从下面的代码可以看出:1、类型为“[5]int”的数组在作为参数时,其实作为值来传递的。2、类型为“[]int”的数组在作为参数时,其实作为引用来传递的。这是由于“[]int”是一个接口么?还是说以“[]int”定义的就是一个slice?待确定。代码片段(2):[代码]数组作为参数时的值传递packagemainimport"fmt"funcmodify(array[5]int){array[0]=10fmt.Println("Inmodify(),arrayvalues:",array)}funcmain(){array:=[5]int{1,2,3,4,5}modify(array)fmt.Println("Inmain(),arrayvalues:",array)}运行结果:Inmodify(),arrayvalues:[102345]Inmain(),arrayvalues:[12345][代码]数组作为参数时的引用传递packagemainimport"fmt"funcmodify(array[]int){array[0]=10fmt.Println("Inmodify(),arrayvalues:",array)}funcmain(){array:=[]int{1,2,3,4,5}modify(array)fmt.Println("Inmain(),arrayvalues:",array)}运行结果:Inmodify(),arrayvalues:[102345]Inmain(),arrayvalues:[102345]
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

[]int和[5]int这两种表达方式在Go语言里有根本性的区别。[]int不是数组,而是数组切片(slice),而[5]int是一个数组。在Go语言中,数组是值类型,而数组切片是引用类型。值类型变量在函数调用时的参数传递中会被完整拷贝一次变量内容,之后函数内操作的只是这个拷贝的副本。这是第32页例子中所表现出来的,函数内对数组的修改不会影响函数外的原始数组内容的原因。一般而言,参数类型会选择数组切片而非数组,以避免拷贝所导致的性能损耗。希望已经解释清楚,没有的话请继续。看来我们这本书再版的时候需要多花一些篇幅解释数组和数组切片的区别。
                            
查看完整回答
反对 回复 2019-03-29
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

第一种是数组,go中数组是值类型
第二种是slice,是引用,不过array:=[]int{1,2,3,4,5},也会产生一个匿名的数组。
                            
查看完整回答
反对 回复 2019-03-29
  • 2 回答
  • 0 关注
  • 1598 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信