《Go之旅#23:返回值的奇怪行为》

huangapple go评论114阅读模式
英文:

A Tour of Go #23: weird behaviour with return

问题

这段代码是一个简单的Go语言程序,它定义了一个名为pow的函数,用于计算给定数字的幂。在main函数中,调用了两次pow函数,并打印出结果。

在第一次调用pow函数时,传入的参数是3、2和10。在函数内部,使用math.Pow函数计算3的2次幂,并将结果赋值给变量v。然后,通过比较vlim的大小,判断是否返回v或打印一条消息。由于27大于等于20,所以会打印出27 >= 20。然后,返回lim的值,即10。

在第二次调用pow函数时,传入的参数是3、3和20。同样地,计算3的3次幂,并将结果赋值给v。由于27大于等于20,所以会打印出27 >= 20。然后,返回lim的值,即20。

如果将return v这一行注释掉,那么在第一次调用pow函数时,不会返回v的值。因此,第一次调用的结果是10,而不是27。第二次调用的结果仍然是20。

这是因为在第一次调用pow函数时,虽然计算出了27,但由于没有返回该值,所以在打印结果时并没有使用该值。因此,第一次调用的结果并不是27,而是10。

英文:

A Tour of Go #23:

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. func pow(x, n, lim float64) float64 {
  7. if v := math.Pow(x, n); v < lim {
  8. return v
  9. } else {
  10. fmt.Printf("%g >= %g\n", v, lim)
  11. }
  12. // can't use v here, though
  13. return lim
  14. }
  15. func main() {
  16. fmt.Println(
  17. pow(3, 2, 10),
  18. pow(3, 3, 20),
  19. )
  20. }

The results are:

  1. 27 >= 20
  2. 9 20

If I comment out the return v line, the results are:

  1. 27 >= 20
  2. 10 20

Why exactly does this happen? Why are results of the first pow() call not equal to 27 >= 20 and 10?

答案1

得分: 1

如@larsmans已经回答的那样,你在第一个调用中传递了一个限制为10的参数,因此返回的数字是10而不是20。

将其更改为:

  1. func main() {
  2. fmt.Println(
  3. pow(3, 2, 20),
  4. pow(3, 3, 20),
  5. )
  6. }

当删除return v行时,你将看到以下输出:

  1. 27 >= 20
  2. 20 20
英文:

As already answered by @larsmans, you're passing a limit of 10 to the first call, thus
the returned number is 10 instead of 20.

Change it to

  1. func main() {
  2. fmt.Println(
  3. pow(3, 2, 20),
  4. pow(3, 3, 20),
  5. )
  6. }

And you will see the following output when removing the return v line:

  1. 27 >= 20
  2. 20 20

huangapple
  • 本文由 发表于 2013年10月10日 21:54:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/19297736.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定