Есть ли ошибка при инициализации переменной - PullRequest
5 голосов
/ 28 апреля 2019

как спецификация golang , я пытаюсь написать тестовый код. как сказано в спецификации, порядок инициализации d, b, c, a , я думаю, b должно быть 4, а c должно быть 5 , но я получил b = = 5 и c == 4 что-то не так? или я неправильно понимаю спецификацию 100

Я пробовал в go версии, как показано ниже

go version go1.12.4 linux/amd64
package main

import "fmt"

var (
    a = c + b
    b = f()
    c = f()
    d = 3
)

func f() int {
    d++
    return d
}

func main() {
    fmt.Println("a", a)
    fmt.Println("b", b)
    fmt.Println("c", c)
    fmt.Println("d", d)
}

результат

result:
a 9
b 5
c 4
d 5

ожидать б = 4, с = 5

1 Ответ

0 голосов
/ 28 апреля 2019

нет, как вы сами сказали, это d, c, b, a

так что д 3

тогда c вызывает f () и d равно 4, поэтому c равно 4

следующий b вызывает f () и d равен 5, поэтому b равен 5

наконец, a - это c + b или 9

и d оказался в 5 из-за побочных эффектов в f ()

Вот вывод компилятора соответствующего раздела

Как вы можете видеть, он устанавливает c (c(SB)), затем b, затем a

  0x004b 00075 (b2.go:6)  CALL  "".f(SB)
  0x0050 00080 (b2.go:6)  MOVQ  (SP), AX
  0x0054 00084 (b2.go:6)  MOVQ  AX, "".c(SB)
  0x005b 00091 (b2.go:5)  CALL  "".f(SB)
  0x0060 00096 (b2.go:5)  MOVQ  (SP), AX
  0x0064 00100 (b2.go:5)  MOVQ  AX, "".b(SB)
  0x006b 00107 (b2.go:4)  MOVQ  "".c(SB), CX
  0x0072 00114 (b2.go:4)  ADDQ  CX, AX
  0x0075 00117 (b2.go:4)  MOVQ  AX, "".a(SB)

(для генерации этого вывода я использовал go tool compile -S -N abcd.go > abcd.s Фактическая нумерация строк кода - от слегка упрощенной версии с удаленными инструкциями fmt import и print)

это с версией go go1.11.4 linux / amd64

Пробовал то же самое с go-версией go1.12.4 linux / amd64, с тем же результатом

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