定义在函数内部的变量以及函数的形参称为局部变量
作用域:从定义哪一行开始直到与其所在的代码块结束
生命周期:从程序运行到定义哪一行开始分配存储空间到程序离开该变量所在的作用域
定义在函数外面的变量称为全局变量
作用域范围:从定义哪行开始直到文件结尾
生命周期:程序一启动就会分配存储空间,直到程序结束
1、指定变量类型,声明后若不赋值,使用默认值
eg:
var i int
i = 10;
2、根据值自行判断变量类型(类型推导)
eg:
var i = 10
3、第三种:省略 var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误 // 简短格式(golang官方推荐格式
eg:
i := 10
// 标准格式
var 变量名称 数据类型 = 值;
// 自动推到类型格式
var 变量名称 = 值;
// 简短格式(golang官方推荐格式)
变量名称 := 值;
var a int // 先定义
a = 11 // 后赋值
fmt.Println(a)
var b = 10
fmt.Println(b)
num4 := 40 // 定义的同时赋值, 并省略关键字和数据类型
/*
num4 := 40 等价于
var num4 int
num4 = 40
*/
// 一次性声明多个变量1
var n1, n2, n3, n4 int
fmt.Println(n1, n2, n3, n4)
------------
var num1, num2, num3 int //先定义
num1 = 10 // 后赋值
num2 = 20
num3 = 30
fmt.Println(num1, num2, num3)
var n1, n2, n3 = "老王", "我是字符串", 888
fmt.Println(n1, n2, n3) // 老王 我是字符串 888, 由此可以看出 值会自动一一对应匹配
-------------
var num1, num2, num3 int = 30, 40, 50 //定义的同时赋值
fmt.Println(num1, num2, num3) //30 40 50
----------
var num1, num2, num3 = 30, 40, 50 //要携带上=
fmt.Println(num1, num2, num3)
n1, n2, n3 := 10, "老王", 888 //因为使用了 := 所以不可以声明变量使用var
fmt.Println(n1, n2, n3) //10 老王 888 , 由此可以看出 值会自动一一对应匹配
----------------
num7, num8 := "老王", 13 //定义的同时赋值并省略关键字和数据类型
fmt.Println(num7, num8)
var ( //先定义
num1 int
num2 float32
)
num1 = 10 //后赋值
num2 = 3.14
fmt.Println(num1, num2)
var ( //定义的同时赋值,并省略数据类型
num1 = 10
num2 = "老王"
)
fmt.Println(num1, num2)
----
var ( //定义的同时赋值
num1 int = 10
num2 float32 = 3.14
)
fmt.Println(num1, num2)
var ( // 一行定义多个
num1, num2 = 70, 80
num3, num4 = 3.14, "老王"
)
fmt.Println(num1, num2, num3, num4)
var (
name = "老王"
age = 10
)
func main() {
fmt.Println(name, age)
}
var (
name = "老王"
age = 10
)
func main() {
fmt.Println(name, age) // 老王 10
// 也可以在内部改变外部的全局变量
name = "老李"
age = 56
fmt.Println(name, age) // 老李 56
}
变量在同一个作用域(在一个函数或者在代码块)内不能重名
var i int = 59
i := 90
fmt.Println(i) //报错 两个变量重名, no new variables on left side of := (exit status 2)
小数默认为 0
package main
import "fmt"
num := 10 // 编译报错
func main() {
fmt.Println("num = ", num)
}
package main
import "fmt"
var num = 10 // 定义一个全局变量
func main() {
num := 20 // 定义一个局部变量
fmt.Println("num = ", num)
test()
}
func test() {
fmt.Println("num = ", num) // 还是输出10
}
num1, num2 := 666, 888 //正确
num1, num2 : =666 //错误
fmt.Println(num1, num2)
// 定义一个num1
num1 := 10
// 同时定义两个变量num1和num2, 由于num2从来没有定义过,
// 所以对于num1来说:=退化为赋值运算符, 而对于num2来说:=仍然是定义+赋值
num1, num2 := 20, 30
fmt.Println(num1, num2)
const 常量名称 数据类型 = 值 or const 常量名称 = 值
const num1, num2 int = 333, 555 //const 常量名称 数据类型 = 值
fmt.Println(num1, num2)
const num3 = 40 // const 常量名称 = 值
fmt.Println(num3)
// 常量组
const (
num7 = 70
num8 = 80
)
fmt.Println(num7, num8)
// 常量组+多重赋值
const (
num9, num10 int = 90, 100
num11 = 110
)
fmt.Println(num9, num10, num11)
1、定义的局部变量或者导入的包没有被使用, 那么编译器会报错,无法编译运行,但是定义的常量没有被使用,编译器不会报错, 可以编译运行
2、常量不支持 := 定义赋值
3、在常量组中, 如果上一行常量有初始值,但是下一行没有初始值, 那么下一行的值就是上一行的
值
值
const (
num1 = 998
num2 // 和上一行的值一样
num3 // 和上一行的值一样
num4 = 999
num5 // 和上一行的值一样
num6 // 和上一行的值一样
)
fmt.Println(num1) // 998
fmt.Println(num2) // 998
fmt.Println(num3) // 998
fmt.Println(num4) // 999
fmt.Println(num5) // 999
fmt.Println(num6) // 999
-------------
const (
num1, num2 int = 100, 200
num3, num4 // 和上一行的值相同,注意变量个数必须也和上一行一样
)
fmt.Println(num1, num2) //100 200
fmt.Println(num3, num4) //100 200
const(
枚举元素1 = iota
枚举元素2 = iota
... ...
)
const (
num5 = iota
num6 = iota
num7 = iota
)
fmt.Println(num5) // 0
fmt.Println(num6) // 1
fmt.Println(num7) // 2
在同一个常量组中,iota从0开始递增, 每一行递增1
在同一个常量组中,只要上一行出现了iota,那么后续行就会自动递增
在同一个常量组中,如果iota被中断, 那么必须显示恢复
iota也支持常量组+多重赋值, 在同一行的iota值相同
iota自增默认数据类型为int类型, 也可以显示指定类型
1、当左右两边都是数值型时,则做加法运算
2、当左右两边都是字符串,则做字符串拼接
name := "老王"
age := 30
sex := "男"
ageOne := 10
//fmt.Println(name + age) // invalid operation: name + age (mismatched types string and int) (exit status 2) 不是同一类型,不可以使用+ 和python一样
fmt.Println(name + sex) // 老王男
fmt.Println(age + ageOne) // 40