V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zeroday
V2EX  ›  问与答

请问 golang 函数参数什么时候传指针什么时候传值呢?

  •  
  •   zeroday · 2016-09-01 00:05:46 +08:00 · 6033 次点击
    这是一个创建于 2796 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看到 aws go sdk 的项目,很多地方都用到指针,比如

    func (c *EC2) RunInstances(input *RunInstancesInput) (*Reservation, error) {
    

    这里 EC2 是指针,参数 RunInstancesInput 是指针,返回值 Reservation 也是指针。

    这种定义方式有什么优点呢?

    10 条回复    2016-09-01 17:28:43 +08:00
    scnace
        1
    scnace  
       2016-09-01 01:12:55 +08:00 via Android
    为了扔 struct 方便啊,别人 C++也不是经常扔指针啊~ (捂脸光速逃
    raincious
        2
    raincious  
       2016-09-01 06:46:00 +08:00 via Android
    kevinzhow
        3
    kevinzhow  
       2016-09-01 06:48:02 +08:00
    ```
    package main

    import "fmt"

    func change(x *int){
    *x += 1
    }

    func changeWithoutPointer(y int){
    y += 1
    fmt.Printf("y without pointer is %d\n", y)
    }

    func main() {
    x := 1
    y := 1
    change(&x)
    changeWithoutPointer(y)
    fmt.Printf("x is %d, y is %d\n", x, y)
    }
    ```

    跑一下这段代码你就知道了
    zeroday
        4
    zeroday  
    OP
       2016-09-01 08:44:37 +08:00 via iPhone
    @kevinzhow 谢谢你的代码,大概了解你的意思。指针作为参数可以操作对象本身。但是上面的代码不用指针也可以的,用指针有什么优点呢?
    mifly
        5
    mifly  
       2016-09-01 08:46:48 +08:00 via iPhone
    如果你要修改对象本身,那就要传指针,否则一般是修改到的是副本
    zeroday
        6
    zeroday  
    OP
       2016-09-01 08:48:16 +08:00 via iPhone
    @raincious 优点是指针的拷贝代价小?
    t0byxdd
        7
    t0byxdd  
       2016-09-01 09:07:40 +08:00 via Android
    把 golang 改成 c/c++搜吧
    Reficul
        8
    Reficul  
       2016-09-01 10:18:44 +08:00 via Android
    不传指针=复制传值=方法只对结构的副本修改,方法执行完了你会发现原结构没变化。

    另外传指针代价小,试想一个巨大的结构体肯定要复制内存的,复制指针的代价小多了。
    Lonely
        9
    Lonely  
       2016-09-01 10:25:32 +08:00 via iPhone
    你看的教程里难道没说直接传的话是值传递?
    yeasy
        10
    yeasy  
       2016-09-01 17:28:43 +08:00
    1. 效率高
    2. 可以修改对象内容
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1736 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:28 · PVG 00:28 · LAX 09:28 · JFK 12:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.