您好,匿名用户
随意问技术百科期待您的加入

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

0 投票

一个很微妙的一个问题。从下面的代码可以看出:
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]

用户头像 提问 2012年 12月1日 @ Sion 上等兵 (319 威望)
分享到:

1个回答

0 投票
 
最佳答案

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

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

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

用户头像 回复 2012年 12月1日 @ Nocturne 上等兵 (262 威望)
选中 2012年 12月1日 @Sion
提一个问题:

相关问题

0 投票
1 回复 29 阅读
+1 投票
1 回复 34 阅读
用户头像 提问 2013年 1月28日 @ IT问答网站 平民 (36 威望)
0 投票
1 回复 33 阅读
用户头像 提问 2012年 12月1日 @ Varus 上等兵 (281 威望)
0 投票
1 回复 31 阅读
用户头像 提问 2012年 12月1日 @ Sejuani 上等兵 (427 威望)
0 投票
1 回复 66 阅读
用户头像 提问 2012年 12月1日 @ Talon 上等兵 (294 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...