2.5 Go 算术运算与变量使用技巧

 

变量作用域

简单来说,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中文
}

 

posted @ 2019-03-31 17:14  方诚  阅读(152)  评论(0编辑  收藏  举报