import (
"fmt"
"time"
)
func WithRecover(r func()) {
r()
}
func printRewardAmount(rewardAmount int) {
fmt.Println(rewardAmount)
}
func main() {
var rewardAmount int
rewardAmount = 1
go WithRecover(func() { printRewardAmount(rewardAmount) })
if true {
rewardAmount = 2
}
time.Sleep(100 * time.Millisecond)
}
由于我们将rewardAmount作为值传递,因此output应该为1。有时候会有两个人,有人能解释一下为什么吗?
1条答案
按热度按时间2guxujil1#
在上面的代码中,您只是将
rewardAmount
的值传递给printRewardAmount()
函数,而不是传递给go例程。因此,rewardAmount
的作用域仍然在go例程之外(在main()
内部)。因此,根据go例程的执行顺序,输出可以是1或2。只需将
main()
替换为以下内容即可查看rewardAmount
的地址full code in playground
但是当您执行以下操作时,实际上是将
rewardAmount
的值复制并传递给go例程。因此,输出将始终为1。full code in playground