欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Golang基础之变量(Variable)

程序员文章站 2022-06-26 16:22:06
...

一、变量以及声明

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语言 ↩︎