一、作用域
1、如果定义了大括号中的变量,不能被它的上级所调用。可以被它的同级所调用,
//定义一个name变量,在if条件中定义age变量。
package main
import "fmt"
func main() {
name := "wang"
fmt.Println(name)
if true {
age := 26
fmt.Println(age)
}
}
//看执行效果
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/wang/GolangProjects #gosetup
/usr/local/go/bin/go build -o /private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go /Users/wang/GolangProjects/src/awesomeProject2/main.go #gosetup
/private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go #gosetup
wang
26
Process finished with exit code 0
//if中的变量不能被上级所调用
package main
import "fmt"
func main() {
name := "wang"
fmt.Println(name)
if true {
age := 26
fmt.Println(age)
}
fmt.Println(name) //同级的变量可以被调用
fmt.Println(age) //不同级的变量无法调用
}
//执行效果如下
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/wang/GolangProjects #gosetup
/usr/local/go/bin/go build -o /private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go /Users/wang/GolangProjects/src/awesomeProject2/main.go #gosetup
# command-line-arguments
./main.go:13:14: undefined: age
Compilation finished with exit code 2
2、可以被它的子级所调用。
//被子级所调用
package main
import "fmt"
func main() {
name := "wang"
fmt.Println(name)
if true {
age := 26
fmt.Println(age)
fmt.Println(name) //在它的子集中定义变量
}
fmt.Println(name)
}
//执行效果如下
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/wang/GolangProjects #gosetup
/usr/local/go/bin/go build -o /private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go /Users/wang/GolangProjects/src/awesomeProject2/main.go #gosetup
/private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go #gosetup
wang
26
wang
wang
Process finished with exit code 0
3、子级中调用变量时,如果同级有,则调用。如果没有,调用父级的。
//if的子级中,新定义一个name变量
package main
import "fmt"
func main() {
name := "wang"
fmt.Println(name)
if true {
age := 26
name := "JIAN"
fmt.Println(age)
fmt.Println(name)
}
fmt.Println(name)
}
//执行效果如下
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/wang/GolangProjects #gosetup
/usr/local/go/bin/go build -o /private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go /Users/wang/GolangProjects/src/awesomeProject2/main.go #gosetup
/private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go #gosetup
wang
26
JIAN
wang
Process finished with exit code 0
4、全局变量,写在function外面,简写的方式不可写。可省略字符类型,局部变量写在函数里面。
package main
import "fmt"
// name := "WANGJIAN" 全局变量,简写不可用
var name2 string = "jian" //定义全局变量
var xingming = "wj" //定义全局变量,省略变量类型
func main() {
name := "wang"
fmt.Println(name)
fmt.Println(name2)
fmt.Println(xingming)
}
//执行效果如下
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/wang/GolangProjects #gosetup
/usr/local/go/bin/go build -o /private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go /Users/wang/GolangProjects/src/awesomeProject2/main.go #gosetup
/private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go #gosetup
wang
jian
wj
Process finished with exit code 0
5、全局变量中放所有函数公用的部分。如因式分解的变量写法也可以调用。
//变量因式分解法
package main
import "fmt"
// name := "WANGJIAN" 全局变量,简写不可用
var name2 string = "jian" //定义全局变量
var xingming = "wj" //定义全局变量,省略变量类型
var (
v1 = 123
v2 = "hello"
v3 int
)
func main() {
name := "wang"
fmt.Println(name)
fmt.Println(name2)
fmt.Println(xingming)
fmt.Println(v1, v2, v3)
}
//执行效果显示
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/wang/GolangProjects #gosetup
/usr/local/go/bin/go build -o /private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go /Users/wang/GolangProjects/src/awesomeProject2/main.go #gosetup
/private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go #gosetup
wang
jian
wj
123 hello 0
Process finished with exit code 0
总结:全局变量,顶格定义的变量,未写在函数里的变量。不可以用v1 := “hello”的写法。局部变量,写在()里的变量。
二、变量的赋值和内存相关
//对变量赋值,内存地址改变
package main
import "fmt"
func main() {
name := "wang"
nickname := "jian"
fmt.Println(name, &name) //获取变量的内存地址 16进制
fmt.Println(nickname, &nickname) //获取变量的内存地址 16进制
}
//重新定义变量,内存地址不改变,内容替换了。
package main
import "fmt"
func main() {
name := "wang"
nickname := "jian"
fmt.Println(name, &name)
fmt.Println(nickname, &nickname)
name = "wj"
fmt.Println(name, &name)
fmt.Println(nickname, &nickname)
}
//执行效果显示
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/wang/GolangProjects #gosetup
/usr/local/go/bin/go build -o /private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go /Users/wang/GolangProjects/src/awesomeProject2/main.go #gosetup
/private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go #gosetup
wang 0xc000010200
jian 0xc000010210
wj 0xc000010200
jian 0xc000010210
Process finished with exit code 0
总结:package main 的作用,特殊的包,如果定义了package main包,必须定义main主函数,编译会生成可执行文件。
三、例子
1.变量的其他写法
var v4,V5 = 11,22
v4,v5 := 11,22
2.查看执行结果
package main
import "fmt"
var number = 99
func main() {
if true {
fmt.Println(number)
}
number = 88
fmt.Println(number)
}
//结果
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/wang/GolangProjects #gosetup
/usr/local/go/bin/go build -o /private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go /Users/wang/GolangProjects/src/awesomeProject2/main.go #gosetup
/private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go #gosetup
99
88
Process finished with exit code 0
package main
import "fmt"
var number = 99
func main() {
number := 88
if true {
number = 123
fmt.Println(number)
}
fmt.Println(number)
}
//执行结果
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/wang/GolangProjects #gosetup
/usr/local/go/bin/go build -o /private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go /Users/wang/GolangProjects/src/awesomeProject2/main.go #gosetup
/private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go #gosetup
123
123
Process finished with exit code 0
package main
import "fmt"
var number = 99
func main() {
fmt.Println(number)
number := 88
if true {
number = 123
fmt.Println(number)
}
fmt.Println(number)
}
//执行结果
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/wang/GolangProjects #gosetup
/usr/local/go/bin/go build -o /private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go /Users/wang/GolangProjects/src/awesomeProject2/main.go #gosetup
/private/var/folders/xb/kpzbs3093glfj2sg30q976cc0000gp/T/___go_build_main_go #gosetup
99
123
123
Process finished with exit code 0
0 Comments