把一个大数组传递给函数会消耗很多内存。有两种方法可以避免这种现象: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) }
谢谢大锅们解惑。我实在不知道怎么百度。
我看的是这个链接
呀,果然咨询各位大佬会明白的很清楚。加粗感谢~谢谢各位大锅。
那个如果函数参数传递的是个指针,如何在函数体中给数组元素赋值呀?
package main import "fmt" func main() { var att = []int{1, 2, 3} //切片 var att2 = [3]int{1, 2, 3} //数组 fmt.Println("------切片------") fmt.Println(att) // [1 2 3] ftt(att) // 切片,引用传递,修改原始的数组 att。 fmt.Println(att) // [111 2 3] fmt.Println("-------数组--------") fmt.Println(att2) // [1 2 3] ftt2(att2) // 数组,产生一次拷贝,不会修改原数组。 fmt.Println(att2) // [1 2 3] } func ftt(a []int) { //切片,引用传递,会修改原来数组 a[0] = 111 fmt.Println(a) } func ftt2(a [3]int) { //数组,产生一次拷贝,不会修改原数组 a[0] = 222 fmt.Println(a) }
![]() | 1 verrickt 2018-05-24 07:08:27 +08:00 via Android ![]() 跑个题,[]arr 在 golang 里叫切片(slice),数组是[int]arr 这样的。var arr = [] int{2,3,3}等价于 var p=[3]{2,3,3} var arr = make(p,3)。 slice 作为数组的 wrapper,提供了一种统一的数组访问形式。具体细节请参阅官方文档 |
![]() | 2 raquelken 2018-05-24 07:50:04 +08:00 ![]() 你确定 ftt 不会修改 att 的值?就像楼上说的,array 和 slice 是有很大区别的。看看 https://blog.golang.org/slices |
3 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 ) |
![]() | 4 Flygar OP 大哥们牛逼!!!我又学到新知识了 |