变量作用域
简单来说,GO的变量以块为范围;一个if-else的块,就可以包含一个变量的生命周期。变量的声明,要在使用之前。
package main import ( "fmt" ) func main(){ var a int = 1 var b int = 10 //这行代码为报错“b declared and not used” fmt.Println(a) //1 { var a int = 2 //块内部的变量作用域会覆盖上级变量的作用域 fmt.Println(a) //2 } // a为2的变量作用范围在块结束的时候,也随之结束,所以下面的a==1的结束为true if a == 1 { var a = 3 fmt.Println(a) //3 }else{ a = 4 //正常 b = 11 } }
注意代码报错的部分,说变量b被声明但没有使用,后面的if-else中不是有"b = 11"吗?
var b int = 10 //这行代码为报错“b declared and not used”
这就充分说明了GO的变量作用是按块分区的,并且对变量的检查不包含自己作用范围内的块。
位运算
右移,通常说右移一位相当于除以2,左移一位相当于乘以2,这只是相当;比如下面这个奇数,如果除以2则变成浮点数,就不能再直接赋值于int变量,但实际上可以;
aa := 11111 if aa>= 10000 { aa = aa>>1 //5555 } fmt.Println(aa)
所以右移就是将数字转换为二进制后,舍弃掉右移的位数,空出来的位数补0.
数字补0
package main import ( "fmt" ) func main(){ n1 := 1 ss := fmt.Sprintf("%02d--%2d",n1,n1) fmt.Println(ss) //01-- 1 }
字符串补0
package main import ( "fmt" ) func main(){ s1 := "1" ss := fmt.Sprintf("%02v--%2v",s1,s1) fmt.Println(ss) //01-- 1 s1 = "A" ss = fmt.Sprintf("%016v--%16v",s1,s1) fmt.Println(ss) //000000000000000A-- A s1 = "中文" ss = fmt.Sprintf("%08v",s1) fmt.Println(ss) //000000中文 }