Golang基础之变量(Variable)
程序员文章站
2022-06-26 16:22:06
...
Golang 变量-Variable
一、变量以及声明
1.1 标记(identify)
规范定义:
- 标识符 命名 程序实体。
- 标识符是一个或多个 Unicode 字母和数字的序列。但标识符的第一个字符必须是Unicode 字母(字母和下划线 _)
- 短变量声明(简式声明 short variable declarations),会根据其使用环境自动推断出去具备的类型。短变量声明在函数内部使用。
- 注意简式声明和全局变量产生的偶然的变量隐藏,即全局变量被覆盖。例:
var x = 10 //全局变量,作用域整个包块
var b = 15
func Variable() {
//var y = 56 // y declared and not used
x := 15 //局部变量 作用域 仅限当前代码块,当前x 覆盖全局变量x
fmt.Println(x) //15
{
fmt.Println(x) // 15
x := 12 //局部变量 ,作用域当前
fmt.Println(x) //12
}
fmt.Println(x) //15
}
- Go 语言的强制规定,在函数内一定要使用全部声明的变量,若存在未使用的变量,就会发生编译错误(如下所示),因此可以将不需要使用的变量使用空白标识符 _ 或直接注释掉。但未使用的全局变量是不限制的,如上面的 全局变量 b,声明了但是未使用,没有发生编译错误。
y declared and not used
- _ (空白标识符)实际上是一个只写变量,不能得到他的值。
- GO 语言中,如果导入的包未使用,也是不能通过编译的。如不直接使用包里的函数,而只是调用包中的 init() 函数,或者调试代码时去掉了对某些包的功能使用,可以使用下划线标识符,来作为这个包的名字,避免编译失败。
- 被引用的变量一般存储在堆内存中,以便系统进行垃圾回收()GC)。
二、零值(nil)
- 当一个变量被var 声明之后,如果没有为其声明指定初始值,Go会自动初始化其值为该类型的默认零值。
- nil 零值,如下所示:
- 复合类型的零值,Go会自动递归将每一个元素初始化为其对应类型的零值。
- Go语言中,需要特别注意,string 字符串的零值不是nil,而是"";
var str string
fmt.Println(str) // ""
- 对一个nil 的切片中添加元素是没有问题的,但是需要注意对一个map 做同样的事将会发生 panic 运行时恐慌。1
func Nil() {
// dacalaration nil slice
var slice []int = nil
// append element
slice = append(slice, 1, 2)
// append(slice, 1, 2)
fmt.Println(slice)
}
nil map 发生运行时恐慌。
func MapNil(){
var m map[string]int
m["a"] = 1 //panic: assignment to entry in nil map
fmt.Println(m["a"])
}
三、Golang 特殊运算符
1.按位置零 &^
将指定位上的值置为零。(将运算符左边数据相异的位保留,相同的位置零)
func Options() {
X := 2 //0000 0010
Y := 4 //0000 0100
c := X &^ Y
d := X & (^Y)
fmt.Printf("%.8b %d\n", c, c) //00000010 2
fmt.Printf("%.8b %d\n", d, d) //00000010 2
fmt.Printf("%+v\n", c == d) //X &^ Y== X & (^Y) //true
}
- 计算过程:
-
X、Y 分别用二进制表示, 0000 0010 &^ 0000 0100 = 0000 0010 。若 y的某位是0 ,则取x 上对应位的值;若 y 的某位上 是 1,则结果位上取 0.
-
(1)如果右侧位是0,则左侧位保持不变。
-
(2)如果右侧位是1,则左侧位置零。
2.异或(^)[XOR]
- Go 语言中,XOR 作为二元运算符存在。但是作为一元运算符出现表示按位取反。
- XOR作为二元运算符,是不进位加法计算,即异或计算,例 0000 0010 + 0000 0100 = 0000 0110 = 6
- 取余运算符只能作用于整数:9%4 =1
- 浮点数除以 0.0 会返回一个无穷尽的结果,用 +Inf 表示;
func inf() {
var a = 15.0
fmt.Println(a / 0.0) //+Inf
}
- ++;-- 在Go 中是语句,非表达式。
- rand.Seed(value) 函数提供伪随机数的生成种子,一般情况下都会使用当前时间(纳秒)做自变量。
-
深入学习GO语言 ↩︎