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

把一个大数组传递给函数会消耗很多内存。有两种方法可以避免这种现象: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) }

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


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

更多关于Golang Go语言中关于函数中把数组作为指针参数传入时,如何给数组赋值的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

跑个题,[]arr 在 golang 里叫切片(slice),数组是[int]arr 这样的。var arr = [] int{2,3,3}等价于 var p=[3]{2,3,3} var arr = make(p,3)。
slice 作为数组的 wrapper,提供了一种统一的数组访问形式。具体细节请参阅官方文档

更多关于Golang Go语言中关于函数中把数组作为指针参数传入时,如何给数组赋值的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你确定 ftt 不会修改 att 的值?就像楼上说的,array 和 slice 是有很大区别的。看看 https://blog.golang.org/slices

[int]T是 array
[]T是 slice

你用的是 slice,本身就是引用类型,ftt 会改变 att 的
需要深入了解一下 Go 里数组和切片的区别
可以看看 slice 的结构,[SliceHeader]( https://golang.org/pkg/reflect/#SliceHeader )

大哥们牛逼!!!我又学到新知识了

在Go语言中,虽然数组是值类型,但当你将数组作为指针参数传入函数时,可以通过解引用指针来修改数组的内容。不过,需要注意的是,Go语言更推荐使用切片(slice)来处理动态数组,因为切片更为灵活且易于使用。不过,既然你提到了数组,这里是如何操作的示例:

首先,定义一个函数,该函数接收一个指向数组的指针作为参数。在函数内部,通过解引用该指针来访问并修改数组的值。

package main

import "fmt"

func modifyArray(arr *[5]int) {
    (*arr)[0] = 10
    (*arr)[1] = 20
}

func main() {
    var myArray [5]int
    fmt.Println("Before:", myArray)
    modifyArray(&myArray)
    fmt.Println("After:", myArray)
}

在这个例子中,modifyArray函数接收一个指向有5个整数的数组的指针。通过(*arr)[index]语法,我们可以修改数组的元素。

然而,如前所述,对于大多数使用场景,使用切片会更方便。切片本质上是对数组的抽象,提供了动态长度的数组功能。如果你只是需要动态大小的数组,建议使用切片而不是数组。

总之,虽然可以通过指针来修改数组,但在Go语言中,切片通常是处理动态数组的首选方式。

回到顶部