Почему я получаю такой вывод из этого простого кода Go? - PullRequest
0 голосов
/ 27 января 2019

Я новичок в Go и очень смущен одним из примеров кодов в учебнике. Вот код и его вывод:

package main

import (
    "fmt"
    "math"
)

func pow(x, n, lim float64) float64 {
    if v := math.Pow(x, n); v < lim {
        return v
    } else {
        fmt.Printf("%g >= %g\n", v, lim)
    }
    return lim
}

func main() {
    fmt.Println(pow(3, 3, 10), pow(4, 3, 20))
}

Когда я запускаю его, вывод этого кода:

27 >= 10
64 >= 20
10 20

Что довольно странно для меня! Я ожидаю этот вывод:

27 >= 10
10
64 >= 20
20

Может кто-нибудь помочь мне понять, что происходит с Println в этом коде?

1 Ответ

0 голосов
/ 27 января 2019

В Go, как и в подавляющем большинстве современных языков программирования, аргументы вызова функции оцениваются до самого вызова функции. Рассмотрим следующую функцию:

func add(i, j int) int {
  return i + j
}

И назовем это так:

func a() int {
  return 2
}

func b() int {
  return 3
}

// ... somewhere in main()
add(a(), b())

Можно ожидать, что к моменту запуска кода add значения i и j станут известны, верно? Затем вызов вернет 5, как и ожидалось. Чтобы включить это, компилятор Go организует аргументы add, а именно a() и b(), которые должны быть запущены до запуска самого add.


То же самое происходит в вашем примере кода с Println и pow. Аргументы Println должны быть оценены до запуска его тела, а оценка pow приводит к печати других вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...