关于函数中把数组作为指针参数传入时,如何给数组赋值的问题。

2018-05-24 01:34:01 +08:00
 Flygar

把一个大数组传递给函数会消耗很多内存。有两种方法可以避免这种现象:1.传递数组的指针。

package main

import "fmt"

func main() {
	var att = []int{1, 2, 3}
	//消耗更多的内存,问题 1:是因为拷贝了数组 att 吗?(att=att)?所以才消耗了更多的内存吗,那我原本的 att 数组怎么让他从内存中释放。
	ftt(att) // 产生一次数组拷贝,ft 方法不会修改原始的数组 att。
	
	var ar = []int{4, 5, 6}
	//传递了数组的指针,不会拷贝数组
	fpp(&ar) // 指针,指向 ar 数组,fp 方法会修改原始数组 ar
}

func ftt(a []int) {
	a[0] = 111
	fmt.Println(a)
}
func fpp(a *[]int) {
	//&a[0] = 444  //问题 2 二:那个这里怎么写呀?我想给 a[0]=444
	fmt.Println(a)
}

谢谢大锅们解惑。我实在不知道怎么百度。
我看的是这个链接

1454 次点击
所在节点    Go 编程语言
4 条回复
verrickt
2018-05-24 07:08:27 +08:00
跑个题,[]arr 在 golang 里叫切片(slice),数组是[int]arr 这样的。var arr = [] int{2,3,3}等价于 var p=[3]{2,3,3} var arr = make(p,3)。
slice 作为数组的 wrapper,提供了一种统一的数组访问形式。具体细节请参阅官方文档
raquelken
2018-05-24 07:50:04 +08:00
你确定 ftt 不会修改 att 的值?就像楼上说的,array 和 slice 是有很大区别的。看看 https://blog.golang.org/slices
heimeil
2018-05-24 09:43:07 +08:00
`[int]T`是 array
`[]T`是 slice

你用的是 slice,本身就是引用类型,ftt 会改变 att 的
需要深入了解一下 Go 里数组和切片的区别
可以看看 slice 的结构,[SliceHeader]( https://golang.org/pkg/reflect/#SliceHeader )
Flygar
2018-05-24 21:18:04 +08:00
大哥们牛逼!!!我又学到新知识了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/457314

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX