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

2016-09-01 00:05:46 +08:00
 zeroday

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

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

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

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

6040 次点击
所在节点    问与答
10 条回复
scnace
2016-09-01 01:12:55 +08:00
为了扔 struct 方便啊,别人 C++也不是经常扔指针啊~ (捂脸光速逃
raincious
2016-09-01 06:46:00 +08:00
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
2016-09-01 08:44:37 +08:00
@kevinzhow 谢谢你的代码,大概了解你的意思。指针作为参数可以操作对象本身。但是上面的代码不用指针也可以的,用指针有什么优点呢?
mifly
2016-09-01 08:46:48 +08:00
如果你要修改对象本身,那就要传指针,否则一般是修改到的是副本
zeroday
2016-09-01 08:48:16 +08:00
@raincious 优点是指针的拷贝代价小?
t0byxdd
2016-09-01 09:07:40 +08:00
把 golang 改成 c/c++搜吧
Reficul
2016-09-01 10:18:44 +08:00
不传指针=复制传值=方法只对结构的副本修改,方法执行完了你会发现原结构没变化。

另外传指针代价小,试想一个巨大的结构体肯定要复制内存的,复制指针的代价小多了。
Lonely
2016-09-01 10:25:32 +08:00
你看的教程里难道没说直接传的话是值传递?
yeasy
2016-09-01 17:28:43 +08:00
1. 效率高
2. 可以修改对象内容

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

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

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

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

© 2021 V2EX