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 呢
1
Nasei 2022-03-23 19:33:20 +08:00 1
```go
func DeferFunc2(i int)(ret int) { t := i ret = t t += 3 return } ``` |
2
iyear 2022-03-23 19:45:49 +08:00 1
|
3
wffnone 2022-03-23 19:58:11 +08:00 via iPhone 1
我回答你这个问题我会觉得我自己是**。
行了我就是**我承认,让我回复。 你问问题,我不管你问的问题是多么简单多么基础,最起码你要把你不懂的地方清楚地表达出来。你没明白,你具体哪里不明白?能再具体一点吗?你有过哪些思考?能列出来吗?你考虑了几种情况,你把一个问题分解成多少个小问题?你认为问题有可能出在哪里? 再回到学习过程。你使用什么学习资料?你还查阅了哪些辅助资料?整个的情境如何?你的基础知识如何? 你真的想了一天吗?如果你真的想了一天,你应该有很多收获,很多非常有价值的在未来学习中都能有帮助的根本性的一些认识。把你这一天分享出来,对专家级的程序员们也会有帮助。 网友们不是你爸妈,大家是平等的。一个好问题也能带给大家价值。而你就有能力给出一个好问题(而你没有给出来)。 为了表达善意(中和恶意),也为了坐实我就是**,让我把参考资料给你。 1. defer: https://go.dev/blog/defer-panic-and-recover 2. scope: https://en.m.wikipedia.org/wiki/Scope_(computer_science) |
4
haozibi 2022-03-23 20:00:52 +08:00 1
这种题有什么意义呢?
|
5
iyear 2022-03-23 20:01:26 +08:00
@wffnone #3 你这阿里味可真冲🤮
``` 你做这个的底层逻辑是什么?顶层设计在哪里?最终交付价值是什么?过程的抓手在哪里?如何保证结果的闭环?能否赋能产品生态?你比别人做的亮点在哪?优势在哪?我没有看到你的沉淀和思考,你有形成自己的方法论吗?你得让别人清楚,凭什么做这个的人是你,换别人来做不一样吗?今年 3.25 你背一下吧。 ``` |
6
Aoang 2022-03-23 20:06:07 +08:00 via iPhone 1
DeferFunc2 中 defer 修改的是 t ,不是返回的值。建议看看 defer 相关的内容
|
7
XTTX 2022-03-23 20:12:11 +08:00
就是一个 passed by value 和 passed by reference 的问题。
|
8
XTTX 2022-03-23 20:14:06 +08:00 1
其实这个最关键的问题, 两种返还值的方式不同。 个人倾向别用 named return.
|
12
XTTX 2022-03-23 20:24:55 +08:00 1
```go
func DeferFunc1(i int) (t int) { fmt.Println(t) t = i defer func() { t += 3 }() fmt.Println(t) return t } ``` reference 和 value 本来就是容易混淆的事, 不管是什么语言。 稍不注意就会出现很多奇奇怪怪的场景. js 也是。 懂了原理过一段时间也会忘掉。 最好就是保持同一种处理方式,这样至少能避免不少麻烦 |
13
twing37 2022-03-23 20:29:07 +08:00 1
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 |