请各位帮忙看看这道题(Go),想了一天没想明白

2022-03-23 19:26:35 +08:00
 Kiriri
这段程序输出什么?
  package main

  func main() {

      println(DeferFunc1(1))
      println(DeferFunc2(1))
      println(DeferFunc3(1))
  }

  func DeferFunc1(i int) (t int) {
      t = i
      defer func() {
          t += 3
      }()
      return t
  }

  func DeferFunc2(i int) int {
      t := i
      defer func() {
          t += 3
      }()
      return t
  }

  func DeferFunc3(i int) (t int) {
      defer func() {
          t += i
      }()
      return 2
  }

输出结果是 4 1 3 ,我没明白第二个为什么会是 1 呢

1615 次点击
所在节点    Go 编程语言
15 条回复
Nasei
2022-03-23 19:33:20 +08:00
```go

func DeferFunc2(i int)(ret int) {
t := i
ret = t
t += 3
return
}

```
iyear
2022-03-23 19:45:49 +08:00
wffnone
2022-03-23 19:58:11 +08:00
我回答你这个问题我会觉得我自己是**。
行了我就是**我承认,让我回复。

你问问题,我不管你问的问题是多么简单多么基础,最起码你要把你不懂的地方清楚地表达出来。你没明白,你具体哪里不明白?能再具体一点吗?你有过哪些思考?能列出来吗?你考虑了几种情况,你把一个问题分解成多少个小问题?你认为问题有可能出在哪里?
再回到学习过程。你使用什么学习资料?你还查阅了哪些辅助资料?整个的情境如何?你的基础知识如何?

你真的想了一天吗?如果你真的想了一天,你应该有很多收获,很多非常有价值的在未来学习中都能有帮助的根本性的一些认识。把你这一天分享出来,对专家级的程序员们也会有帮助。

网友们不是你爸妈,大家是平等的。一个好问题也能带给大家价值。而你就有能力给出一个好问题(而你没有给出来)。

为了表达善意(中和恶意),也为了坐实我就是**,让我把参考资料给你。

1. defer: https://go.dev/blog/defer-panic-and-recover
2. scope: https://en.m.wikipedia.org/wiki/Scope_(computer_science)
haozibi
2022-03-23 20:00:52 +08:00
这种题有什么意义呢?
iyear
2022-03-23 20:01:26 +08:00
@wffnone #3 你这阿里味可真冲🤮

```
你做这个的底层逻辑是什么?顶层设计在哪里?最终交付价值是什么?过程的抓手在哪里?如何保证结果的闭环?能否赋能产品生态?你比别人做的亮点在哪?优势在哪?我没有看到你的沉淀和思考,你有形成自己的方法论吗?你得让别人清楚,凭什么做这个的人是你,换别人来做不一样吗?今年 3.25 你背一下吧。
```
Aoang
2022-03-23 20:06:07 +08:00
DeferFunc2 中 defer 修改的是 t ,不是返回的值。建议看看 defer 相关的内容
XTTX
2022-03-23 20:12:11 +08:00
就是一个 passed by value 和 passed by reference 的问题。
XTTX
2022-03-23 20:14:06 +08:00
其实这个最关键的问题, 两种返还值的方式不同。 个人倾向别用 named return.
wffnone
2022-03-23 20:14:57 +08:00
@iyear OP 说想了一天啊。我是真的有点好奇怎么能想一天,问题都是我真心的提问- -…
iyear
2022-03-23 20:16:06 +08:00
@wffnone #9 我以为是夸张描述吧,如果是真想了一天我收回我的回复.sorry
wffnone
2022-03-23 20:18:29 +08:00
@iyear 哎,我是老实人吧。我承认我语气不太好,但是也不是完全言之无物的吧- -可能语气很重要吧
XTTX
2022-03-23 20:24:55 +08:00
```go
func DeferFunc1(i int) (t int) {
fmt.Println(t)
t = i
defer func() {
t += 3
}()
fmt.Println(t)
return t
}
```

reference 和 value 本来就是容易混淆的事, 不管是什么语言。 稍不注意就会出现很多奇奇怪怪的场景. js 也是。 懂了原理过一段时间也会忘掉。 最好就是保持同一种处理方式,这样至少能避免不少麻烦
twing37
2022-03-23 20:29:07 +08:00
For instance, if the deferred function is a function literal and the surrounding function has named result parameters that are in scope within the literal, the deferred function may access and modify the result parameters before they are returned. If the deferred function has any return values, they are discarded when the function completes. (See also the section on handling panics.)

https://go.dev/ref/spec#Defer_statements
Kiriri
2022-03-23 20:30:38 +08:00
@wffnone 夸张描述,抱歉,只是这一天中,隔一时半会就会想一下,没想明白。
TheF00L
2022-03-24 09:39:51 +08:00
@wffnone 搁这当爹来了,您是真**🤢

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

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

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

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

© 2021 V2EX