V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Flygar
V2EX  ›  Go 编程语言

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

  •  
  •   Flygar · 2018-05-24 01:34:01 +08:00 · 1599 次点击
    这是一个创建于 2375 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2018-05-24 21:17:06 +08:00

    呀,果然咨询各位大佬会明白的很清楚。加粗感谢~谢谢各位大锅
    那个如果函数参数传递的是个指针,如何在函数体中给数组元素赋值呀?

    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)
    }
    
    verrickt
        1
    verrickt  
       2018-05-24 07:08:27 +08:00 via Android   ❤️ 1
    跑个题,[]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
        2
    raquelken  
       2018-05-24 07:50:04 +08:00   ❤️ 1
    你确定 ftt 不会修改 att 的值?就像楼上说的,array 和 slice 是有很大区别的。看看 https://blog.golang.org/slices
    heimeil
        3
    heimeil  
       2018-05-24 09:43:07 +08:00   ❤️ 1
    `[int]T`是 array
    `[]T`是 slice

    你用的是 slice,本身就是引用类型,ftt 会改变 att 的
    需要深入了解一下 Go 里数组和切片的区别
    可以看看 slice 的结构,[SliceHeader]( https://golang.org/pkg/reflect/#SliceHeader )
    Flygar
        4
    Flygar  
    OP
       2018-05-24 21:18:04 +08:00
    大哥们牛逼!!!我又学到新知识了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   926 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:22 · PVG 05:22 · LAX 13:22 · JFK 16:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.