全局变量内联赋值与组合声明/赋值运算符和另一个未声明的变量丢失范围?

Bli*_*Top 12 go

这个Go程序不会编译.它抛出错误global_var declared and not used

package main

import "log"

var global_var int

func main() {

    global_var, new_string := returnTwoVars()

    log.Println("new_string: " + new_string)
}

func returnTwoVars() (int, string) {
    return 1234, "woohoo"
}

func usesGlobalVar() int {
    return global_var * 2
}
Run Code Online (Sandbox Code Playgroud)

但是,当我:=通过new_string在main函数中声明并简单地使用来消除使用运算符的需要时=,编译器看到global_var全局声明并在程序中的其他地方使用时没有问题.我的直觉告诉我它应该知道global_var已经宣布了

cni*_*tar 14

编译器不会抱怨global_var外部主体.它只会抱怨global_var您不使用的主要新创建.您可以通过查看go提及的行号来查看.

你可以尝试一个global_var没有人引用的外部任何函数的空程序:没有问题.当然,在usesGlobalVar该功能确实引用实际全局符号无关与您创建一个main.

  • 搜索"golang shadowing".如果从内部范围重新声明外部作用域中的名称,则会有一个全新的变量.通常,就像在这里一样,令人困惑. (4认同)
  • 我想:=将声明任何未在本地范围内声明的变量.它似乎含糊不清,但我想这只是事情的方式. (3认同)