变量声明 Link to heading

Goalng中声明变量有两种形式一种为标准形式,一种为短声明形式。标准形式的变量声明需要用到的var关键字。每个var关键字后面跟随一个变量名。下面演示这两种变量声明形式:

// go_variable_basic.go

package main

import "fmt"

// 在函数外部声明的变量为全局变量或者包变量
// 在函数内部声明的变量为局部变量

// 标准形式 全局变量
var name, addr string = "张学友", "中国香港"
var age int = 62

// 标准形式利用类型推断
var school = "北京大学"
var since = 1898

// 标准形式的省略初始值, 利用各自类型的默认值声明
var language string
var compiled bool
var number int

func main() {
	fmt.Println(name, addr, age, school, language, compiled, number)

	// 短声明形式只可在函数内部使用,用来声明局部变量
	// 注意!!!
	// golang 当一个局部变量被声明之后至少要被使用一次
	// 否则编译器将会报错, 全局变量则不受此限制

	bookName := "局外人"
	fmt.Println(bookName)
}
go run go_variable_basic.go

张学友 中国香港 62 北京大学  false 0
局外人

变量和常量的作用域 Link to heading

在 Golang 一对大括号来显式形成一个(局部)代码块。一个代码块可以内嵌另一个代码块。 最外层的代码块称为包级代码块。 一个声明在一个内层代码块中的常量或者变量将遮挡另一个外层代码块中声明的同名变量或者常量。

下面的代码中声明了 3 个名为 a 的变量。 内层的 a 将遮挡外层的 a.

//  go_variable_basic02.go
package main

import (
	"fmt"
)

const b = 50

var a = 100

func main() {
	fmt.Println()

	// 这里的a 函数外部的全局变量(同名)进行了遮挡
	a := true

	{
		// 重新声明 左边的a b
		//右边的a 为当前代码块外层的bool类型的a
		// 右边的b 为 全局变量 const b

		a, b := a, b-10

		//
		//
		a, c := !a, b/2
		fmt.Println(a, b, c)
	}

	fmt.Println(a)
	fmt.Println(b)
	// fmt.Println(c) 编译报错 c 由上文代码块定义外部不可见
}
$ go run go_variable_basic02.go
false 40 20
true
50

一个全局变量或者常量的作用域为其所处于的整个代码包。 一个局部变量或者常量的作用域开始于此变量或者常量的声明的下一行,结束于最内层包含此变量或者常量的声明语句的代码块的结尾。 这解释了为什么上例中的 fmt.Println(c)将编译不通过。