登录
首页 >  Golang >  Go问答

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

来源:SegmentFault

时间:2023-01-08 08:13:44 259浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《关于Go语言中数组的参数传递问题》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

一个很微妙的一个问题。从下面的代码可以看出:
1、类型为“[5]int”的数组在作为参数时,其实作为值来传递的。
2、 类型为“[]int”的数组在作为参数时,其实作为引用来传递的。

这是由于“[]int”是一个接口么?还是说以“[]int”定义的就是一个slice?待确定。

代码片段(2):

[代码] 数组作为参数时的值传递

package main import "fmt" func modify(array [5]int) { array[0] = 10 fmt.Println("In modify(), array values:", array) } func main() { array := [5]int{1,2,3,4,5} modify(array) fmt.Println("In main(), array values:", array) }

运行结果:
In modify(), array values: [10 2 3 4 5]
In main(), array values: [1 2 3 4 5]

[代码] 数组作为参数时的引用传递

package main import "fmt" func modify(array []int) { array[0] = 10 fmt.Println("In modify(), array values:", array) } func main() { array := []int{1,2,3,4,5} modify(array) fmt.Println("In main(), array values:", array) }

运行结果:
In modify(), array values: [10 2 3 4 5]
In main(), array values: [10 2 3 4 5]

正确答案

[]int和[5]int这两种表达方式在Go语言里有根本性的区别。[]int不是数组,而是数组切片(slice),而[5]int是一个数组。在Go语言中,数组是值类型,而数组切片是引用类型。

值类型变量在函数调用时的参数传递中会被完整拷贝一次变量内容,之后函数内操作的只是这个拷贝的副本。这是第32页例子中所表现出来的,函数内对数组的修改不会影响函数外的原始数组内容的原因。一般而言,参数类型会选择数组切片而非数组,以避免拷贝所导致的性能损耗。

希望已经解释清楚,没有的话请继续。看来我们这本书再版的时候需要多花一些篇幅解释数组和数组切片的区别。

以上就是《关于Go语言中数组的参数传递问题》的详细内容,更多关于golang的资料请关注golang学习网公众号!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>