Golang基础之变量(Variable)的那些坑

Golang 变量-Variable

    • 一、变量以及声明
    • 二、零值(nil)
    • 三、Golang 特殊运算符
      • 1.按位置零 &^
      • 2.异或(^)[XOR]

一、变量以及声明

1.1 标记(identify)

标记
标识符-identifiers
字母 - 数字 - 下划线
关键字-keywords
25 个
运算符-operators
字面量-literals
真实值
标点符号-punctuation
逗号

规范定义:

  1. 标识符 命名 程序实体。
  2. 标识符是一个或多个 Unicode 字母和数字的序列。但标识符的第一个字符必须是Unicode 字母(字母和下划线 _
  3. 短变量声明(简式声明 short variable declarations),会根据其使用环境自动推断出去具备的类型。短变量声明在函数内部使用。
  4. 注意简式声明和全局变量产生的偶然的变量隐藏,即全局变量被覆盖。例:
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

}
  1. Go 语言的强制规定,在函数内一定要使用全部声明的变量,若存在未使用的变量,就会发生编译错误(如下所示),因此可以将不需要使用的变量使用空白标识符 _ 或直接注释掉。但未使用的全局变量是不限制的,如上面的 全局变量 b,声明了但是未使用,没有发生编译错误。
y declared and not used
  1. _ (空白标识符)实际上是一个只写变量,不能得到他的值。
  2. GO 语言中,如果导入的包未使用,也是不能通过编译的。如不直接使用包里的函数,而只是调用包中的 init() 函数,或者调试代码时去掉了对某些包的功能使用,可以使用下划线标识符,来作为这个包的名字,避免编译失败。
  3. 被引用的变量一般存储在堆内存中,以便系统进行垃圾回收()GC)。

二、零值(nil)

  1. 当一个变量被var 声明之后,如果没有为其声明指定初始值,Go会自动初始化其值为该类型的默认零值。
  2. nil 零值,如下所示:
nil
pointer
interface
function
map
channel
slice
  1. 复合类型的零值,Go会自动递归将每一个元素初始化为其对应类型的零值。
  2. Go语言中,需要特别注意,string 字符串的零值不是nil,而是"";
var  str string
fmt.Println(str)  // "" 
  1. 对一个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]

  1. Go 语言中,XOR 作为二元运算符存在。但是作为一元运算符出现表示按位取反。
  2. XOR作为二元运算符,是不进位加法计算,即异或计算,例 0000 0010 + 0000 0100 = 0000 0110 = 6
  3. 取余运算符只能作用于整数:9%4 =1
  4. 浮点数除以 0.0 会返回一个无穷尽的结果,用 +Inf 表示;
func inf() {
	var a = 15.0
	fmt.Println(a / 0.0)  //+Inf
}
  1. ++;-- 在Go 中是语句,非表达式。
  2. rand.Seed(value) 函数提供伪随机数的生成种子,一般情况下都会使用当前时间(纳秒)做自变量。

  1. 深入学习GO语言 ↩︎

你可能感兴趣的:(Golang,基础,Go成长之路)