Overview
- 声明变量
- 声明+赋值
- 先声明后赋值
- 全局变量与局部变量
- 作用域
- 一个{}就是一个作用域
- 作用域变量引用
- 同级别的作|用域中的变量可以引用
- 上级无法引用下一级的变量
- 作用域只可以引用同级或上一级(父级)的变量
- 引用上一级
- 引用同一级
- 变量简写
- 因式分解
- 变量与内存关系
Description
1)声明变量
-
声明+赋值
package main
import "fmt"
func main() {
var name string = "Jeremy"
fmt.Println(name)
}
-
先声明,后赋值
package main
import "fmt"
func main() {
var name string
name = "Jeremy"
fmt.Println(name)
}
2)全局变量和局部变量
-
全局变量
全局变量是写在顶格的变量,一般用于通用变量使用

package main
import "fmt"
var result string = "OK"
func main() {
fmt.Println(result)
}
-
局部变量
局部变量是在函数func中,一个{}内的变量即是一个局部变量

package main
import "fmt"
func main() {
var result string = "OK"
fmt.Println(result)
}
3)作用域
一个{}就是一个作用域

package main
import "fmt"
func main() {
var result_1 string = "OK"
fmt.Println(result_1)
if true {
var result_2 string = "No"
fmt.Println(result_2)
}
}
这里有2个作用域func{}和 if true{}, if true{}的作用域是func{}的子集,也就是func{}是if true{}的上级(父级)
-
作用域变量引用
同级别的作用域中的变量可以被引用

package main
import "fmt"
func main() {
var result_1 string = "OK"
fmt.Println(result_1)
if true {
var result_2 string = "No"
fmt.Println(result_2)
var result_3 string
result_3 = "Updating"
result_3 = "Completed"
fmt.Println(result_3)
}
}
上级无法引用下一级的变量

package main
import "fmt"
func main() {
var result_1 string = "OK"
fmt.Println(result_1)
fmt.Println(result_2)
fmt.Println(result_3)
if true {
var result_2 string = "No"
fmt.Println(result_2)
var result_3 string
result_3 = "Updating"
result_3 = "Completed"
fmt.Println(result_3)
}
}
作用域只可以引用同级或上一级(父级)的变量
- 引用上一级

这个案例中,在最内部的作用域中并没有定义变量name, 所以一直向上一级寻找变量name,直到找到为止,若没有找到定义该变量,则语法会报错,当找到变量name后,输出该变量的值
package main
import "fmt"
func main() {
var name string = "Jeremy"
if true {
if true {
fmt.Println(name)
}
}
}
- 引用同一级

这个案例中,最内部没有找到定义变量的内容,于是一直向上找,直到找到为止,找到var name string = "Jeremy", 最内部又对name重新赋值,则最终结果则是Kelvin
package main
import "fmt"
func main() {
var name string = "Jeremy"
if true {
if true {
name = "Kelvin"
fmt.Println(name)
}
}
}
4)变量简写
局部变量简写 ( var name string = "Jeremy")
可以简写为 var name = "Jeremy"

package main
import "fmt"
func main() {
var name = "Jeremy"
fmt.Println(name)
}
也可以简写为 name := "Jeremy"

package main
import "fmt"
func main() {
name := "Jeremy"
fmt.Println(name)
}
全局变量简写( var name string = "Jeremy")
可以简写为var name = "Jeremy"

package main
import "fmt"
var name = "Jeremy"
func main() {
fmt.Println(name)
}
不可以简写为name := "Jeremy"

5)因式分解

可以将各种变量放到一个()里
package main
import "fmt"
func main() {
var (
name string = "Jeremy"
age int = 18
color string
gender = "Male"
)
fmt.Println(name, age, color, gender)
}
未定义的变量,都有默认值,比如int就是0,string是个空,bool是false
6)变量与内存关系
声明赋值一个变量

定义一个变量: var name string = "Jeremy", 则会在内存中创建一块内存地址0xc00004e250保存Jeremy
package main
import "fmt"
func main() {
var name = "Jeremy"
fmt.Println(name, &name)
}
内存关系

对变量再次引用

定义另一个变量nickname等于变量name,可以看到nickname的值和name的值都一样为Jeremy,但是内存地址不一样,原因是因为在Go中,变量的引用是在内存中重新Copy一份内存地址
package main
import "fmt"
func main() {
var name = "Jeremy"
fmt.Println(name, &name)
nickname := name
fmt.Println(nickname, &nickname)
}
内存关系



327






