频道栏目
首页 > 资讯 > 其他 > 正文

数组和切片作为函参传递的不同

17-07-19        来源:[db:作者]  
收藏   我要投稿
先说结论(这里以int为例): []int会作为切片按地址进行传递 [3]int会作为数组按值传递

Golang代码实例

package main

import "fmt"

func main(){
  a:=[]int{1,2,3}
  modifySlice(a)
  fmt.Println("main()中 a:",a)
}

func modifySlice(a []int){
  a[0]=100
  fmt.Println("对切片进行modify1()之后 a:",a)
}
输出结果 对切片进行modifySlice()之后 a: [100 2 3]
main()中 a: [100 2 3]
package main

import "fmt"

func main(){
  a:=[]int{1,2,3}
  modifySlice(a)
  fmt.Println("main()中 a:",a)
}

func modifySlice(a []int){
  a[0]=100
  fmt.Println("对切片进行modify1()之后 a:",a)
}
输出结果 对数组进行modifyArray()之后 a: [100 2 3]
main()中 a: [1 2 3]

解决了这个问题之后,又遇到一个奇怪的问题,花了一点时间找到了问题所在,现在贴出来供参考:

当函数要返回经过操作之后的slice时,返回的slice的地址发生了改变,不再是传入的地址,代码如下

package main

import (
  "fmt"
  "unsafe"
  )

func main(){
  a:=[]int{1,2,3}
  b:=modifySlice(a)
  fmt.Println(&a==&b)
  fmt.Println("作为参数的a的地址:",unsafe.Pointer(&a))
  fmt.Println("modifySlice返回的a的地址:",unsafe.Pointer(&b))

}

func modifySlice(a []int) []int{
  a[0]=100
  return a
}
输出结果 false
作为参数的a的地址: 0x115520e0
modifySlice返回的a的地址: 0x115520f0
相关TAG标签
上一篇:C陷阱与缺陷第一章
下一篇:java成长之路(1)——数据类型和运算符
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站