一、作用域

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
Categories: go

0 Comments

发表评论

Avatar placeholder

邮箱地址不会被公开。 必填项已用*标注