Вы имеете дело с двумя разными переменными x из-за того, что ваша вторая x: = находится в другой области. Таким образом, для вас это выглядит как один и тот же x, но это не так, даже если оно основано на значении внешнего x, это не влияет на него. X, который вы печатаете, является внутренним x.
Рассмотрим этот пример :
package main
import (
"fmt"
)
func main() {
// Define x in the func scope
x := 10
// Print out global scope x
fmt.Printf("x1:%v\n", x)
// Not allowed (x already defined in this scope)
//x := x + 1
// Allowed (different x)
{
x := x + 1
// Print new local scope x (this is a second x)
fmt.Printf("x2:%v\n", x)
}
// Allowed (different x defined)
if x := x + 1; x > 10 {
// Print new local scope x (this is a third x)
fmt.Printf("x3:%v\n", x)
}
// Print out global scope x
fmt.Printf("x1:%v\n", x)
}
В этом примере у вас есть 3 x переменных. Забавный c уровень первый, первый в пределах {}, затем другой (снова независимый) в блоке if. Все три из них независимы, и два внутренних затеняют внешний после того, как они определены (в этой области), поэтому даже если вы выберете основание x 2 и 3 на начальном x, они не повлияют на его значение.
Вы можете увидеть это, когда распечатываете глобальную область видимости x в конце, и поскольку x3 не зависит от значения x2, мы оказываемся в конце функции: