Go每日一题(87) 的题目如下

5792 次点击 · 7 赞 ·大约8小时之前 开始浏览   · 来源「Golang来啦」

下面这段代码输出什么?

func main() {
	a := 1
	b := 2
	defer calc("1", a, calc("10", a, b))
	a = 0
	defer calc("2", a, calc("20", a, b))
	b = 1
}

func calc(index string, a, b int) int {
	ret := a + b
	fmt.Println(index, a, b, ret)
	return ret
}
5792 阅读
50 回复
euibieur894
euibieur894 · #1 · 3年之前

打卡

Champagne
Champagne · #2 · 3年之前

打卡

minQie
minQie · #3 · 3年之前

di

henry1
henry1 · #4 · 3年之前

打卡

jan-bar
jan-bar · #5 · 3年之前
package main

import (
    "fmt"
)

func main() {
    fmt.Println("main", inc())
}

func inc() int {
    t := &test{num: 0}
    defer t.Inc(3).Inc(2).Inc(1)
    fmt.Println("inc", t.num)
    return t.num
}

type test struct {
    num int
}

func (t *test) Inc(flag int) *test {
    t.num++
    fmt.Println("test", flag, t.num)
    return t
}

答案是

test 3 1
test 2 2
inc 2
test 1 3
main 2

我的这个测试代码更能够理解defer的逻辑。

在执行defer t.Inc(3).Inc(2).Inc(1)时,从左到右先计算了3,2这两个,最后的1才压栈。

根据结果可看到先执行return t.num,因为main 2表示最终返回值是2

所以return先执行,然后再执行之前压栈的defer t.Inc(1)

gokx
gokx · #6 · 3年之前

mark

gokx
gokx · #7 · 3年之前
jan-barjan-bar #5 回复

```go package main import ( "fmt" ) func main() { fmt.Println("main", inc()) } func inc() int { t := &test{num: 0} defer t.Inc(3).Inc(2).Inc(1) fmt.Println("inc", t.num) return t.num } type test struct { num int } func (t *test) Inc(flag int) *test { t.num++ fmt.Println("test", flag, t.num) return t } ``` 答案是 ```text test 3 1 test 2 2 inc 2 test 1 3 main 2 ``` 我的这个测试代码更能够理解defer的逻辑。 在执行`defer t.Inc(3).Inc(2).Inc(1)`时,从左到右先计算了`3`,`2`这两个,最后的`1`才压栈。 根据结果可看到先执行`return t.num`,因为`main 2`表示最终返回值是2 所以return先执行,然后再执行之前压栈的`defer t.Inc(1)`

这个解释的很清楚

xuegao
xuegao · #8 · 3年之前
jan-barjan-bar #5 回复

```go package main import ( "fmt" ) func main() { fmt.Println("main", inc()) } func inc() int { t := &test{num: 0} defer t.Inc(3).Inc(2).Inc(1) fmt.Println("inc", t.num) return t.num } type test struct { num int } func (t *test) Inc(flag int) *test { t.num++ fmt.Println("test", flag, t.num) return t } ``` 答案是 ```text test 3 1 test 2 2 inc 2 test 1 3 main 2 ``` 我的这个测试代码更能够理解defer的逻辑。 在执行`defer t.Inc(3).Inc(2).Inc(1)`时,从左到右先计算了`3`,`2`这两个,最后的`1`才压栈。 根据结果可看到先执行`return t.num`,因为`main 2`表示最终返回值是2 所以return先执行,然后再执行之前压栈的`defer t.Inc(1)`

:+1:

feiyang
feiyang · #9 · 3年之前
jan-barjan-bar #5 回复

```go package main import ( "fmt" ) func main() { fmt.Println("main", inc()) } func inc() int { t := &test{num: 0} defer t.Inc(3).Inc(2).Inc(1) fmt.Println("inc", t.num) return t.num } type test struct { num int } func (t *test) Inc(flag int) *test { t.num++ fmt.Println("test", flag, t.num) return t } ``` 答案是 ```text test 3 1 test 2 2 inc 2 test 1 3 main 2 ``` 我的这个测试代码更能够理解defer的逻辑。 在执行`defer t.Inc(3).Inc(2).Inc(1)`时,从左到右先计算了`3`,`2`这两个,最后的`1`才压栈。 根据结果可看到先执行`return t.num`,因为`main 2`表示最终返回值是2 所以return先执行,然后再执行之前压栈的`defer t.Inc(1)`

感谢大佬分享

summers
summers · #10 · 3年之前

m

TimLiuDream
TimLiuDream · #11 · 3年之前

mark

Pig18
Pig18 · #12 · 3年之前

打卡 学废了

dingweihua
dingweihua · #13 · 3年之前

mark

brothersam
brothersam · #14 · 3年之前

10 1 2 3 \n 20 0 2 2 \n 2 0 2 2 \n 1 1 3 4 (golang码农求职)

henry1
henry1 · #15 · 3年之前

打卡

feiyang
feiyang · #16 · 3年之前

第二次打卡

NovaChaos
NovaChaos · #17 · 3年之前

mk

a406299736
a406299736 · #18 · 3年之前

打卡。。。。。。。。。。。。。

neil_liu
neil_liu · #19 · 3年之前
jan-barjan-bar #5 回复

```go package main import ( "fmt" ) func main() { fmt.Println("main", inc()) } func inc() int { t := &test{num: 0} defer t.Inc(3).Inc(2).Inc(1) fmt.Println("inc", t.num) return t.num } type test struct { num int } func (t *test) Inc(flag int) *test { t.num++ fmt.Println("test", flag, t.num) return t } ``` 答案是 ```text test 3 1 test 2 2 inc 2 test 1 3 main 2 ``` 我的这个测试代码更能够理解defer的逻辑。 在执行`defer t.Inc(3).Inc(2).Inc(1)`时,从左到右先计算了`3`,`2`这两个,最后的`1`才压栈。 根据结果可看到先执行`return t.num`,因为`main 2`表示最终返回值是2 所以return先执行,然后再执行之前压栈的`defer t.Inc(1)`

学到了

mingliangge
mingliangge · #20 · 3年之前

1

QRQRQRqrqr
QRQRQRqrqr · #21 · 3年之前

defer 执行

Zuos
Zuos · #22 · 3年之前

mark

felixzxk
felixzxk · #23 · 3年之前

m

abcdhope
abcdhope · #24 · 3年之前

嵌套函数在defer中的执行顺序

don178
don178 · #25 · 3年之前

打卡

mingtop
mingtop · #26 · 3年之前

好麻烦。。

Natsuwau
Natsuwau · #27 · 3年之前

mark defer

AntonyZhang
AntonyZhang · #28 · 3年之前

make

hasbug
hasbug · #29 · 3年之前

mark

yayaleslie
yayaleslie · #30 · 3年之前

mark

a406299736
a406299736 · #31 · 2年之前

11111111111111

1121cczj
1121cczj · #32 · 2年之前
jan-barjan-bar #5 回复

```go package main import ( "fmt" ) func main() { fmt.Println("main", inc()) } func inc() int { t := &test{num: 0} defer t.Inc(3).Inc(2).Inc(1) fmt.Println("inc", t.num) return t.num } type test struct { num int } func (t *test) Inc(flag int) *test { t.num++ fmt.Println("test", flag, t.num) return t } ``` 答案是 ```text test 3 1 test 2 2 inc 2 test 1 3 main 2 ``` 我的这个测试代码更能够理解defer的逻辑。 在执行`defer t.Inc(3).Inc(2).Inc(1)`时,从左到右先计算了`3`,`2`这两个,最后的`1`才压栈。 根据结果可看到先执行`return t.num`,因为`main 2`表示最终返回值是2 所以return先执行,然后再执行之前压栈的`defer t.Inc(1)`

mark

wzbwzt
wzbwzt · #33 · 2年之前

1

huangyf168
huangyf168 · #34 · 2年之前

mark

mingtop
mingtop · #35 · 2年之前

10 1 2 3 被遗漏了。。。

hasbug
hasbug · #36 · 2年之前

mark

NovaChaos
NovaChaos · #37 · 2年之前

mk

huangyf168
huangyf168 · #38 · 2年之前

mark

YuPeng
YuPeng · #39 · 2年之前

打卡

hasbug
hasbug · #40 · 2年之前

mark

hupeng
hupeng · #41 · 2年之前

mark

cllgeek
cllgeek · #42 · 2年之前

打卡

YuPeng
YuPeng · #43 · 2年之前

mark

hasbug
hasbug · #44 · 2年之前

mark

cllgeek
cllgeek · #45 · 2年之前

题目重复了,和之前的

528548004
528548004 · #46 · 大约1年之前

image.png

1174en
1174en · #47 · 大约1年之前

m

BigBigGopher
BigBigGopher · #48 · 大约1年之前

mark

zhangwei_go
zhangwei_go · #49 · 大约1年之前

10 1 2 3 20 0 2 2 2 0 2 2 1 1 3 4 程序执行到 main() 函数三行代码的时候,会先执行 calc() 函数的 b 参数,即:calc("10",a,b),输出:10 1 2 3,得到值 3,因为 defer 定义的函数是延迟函数,故 calc("1",1,3) 会被延迟执行;

程序执行到第五行的时候,同样先执行 calc("20",a,b) 输出:20 0 2 2 得到值 2,同样将 calc("2",0,2) 延迟执行;

程序执行到末尾的时候,按照栈先进后出的方式依次执行:calc("2",0,2),calc("1",1,3),则就依次输出:2 0 2 2,1 1 3 4。

420303865
420303865 · #50 · 9月之前

mark

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传