一次5-10分钟即可搞定,实用+效率!
上文提到go中各种运算符(一)本文继续补充关系运算符、位运算符及混合应用。
目录
关系运算符
位运算符
混合应用(重要)
关系运算符
包括==、>、<、>=、<=、!= 是不是很面熟,我们快速过一下:
var a, b = 1, 2
c := a + b
d := 1
fmt.Printf("a>b: %v\n", a > b)
fmt.Printf("a<b: %v\n", a < b)
fmt.Printf("c>=b: %v\n", c >= b)
fmt.Printf("a<=c: %v\n", a <= c)
fmt.Printf("a!=c: %v\n", a != c)
fmt.Printf("a==d: %v\n", a == d)
speed running:
a>b: false
a<b: true
c>=b: true
a<=c: true
a!=c: true
a==d: true
位运算符
&:按位与
|:按位或
^:按位异或,二进制位相异为1
<<:左移运算符,左移n位相当于*2的n次方
>>:右移运算符,右移n位相当于除以2的n次方
我们设定下面两个数来模拟一下:
var (
a = 52 // 0011 0100
b = 93 // 0101 1101
)
fmt.Printf("a & b = %v\n", a & b)
fmt.Printf("a | b = %v\n", a | b)
fmt.Printf("a ^ b = %v\n", a ^ b)
fmt.Printf("a << 2 = %v\n", a << 2)
fmt.Printf("a >> 3 = %v\n", a >> 3)
fmt.Printf("b >> 3 = %v\n", b >> 3)
按既定规则分析推演:
a=0011 0100
b=0101 1101
推算:
&=0001 0100 = 20
|=0111 1101 = 125
^=0110 1001 = 105
a << 2:
1101 0000 = 208
a >> 3:
0000 0110 = 6
b >> 3:
0000 1011 = 11
来看看结果对不对,speed running:
a & b = 20
a | b = 125
a ^ b = 105
a << 2 = 208
a >> 3 = 6
b >> 3 = 11
混合应用(重要)
这里综合了常见玩法,重点看看:
var (
a, b = 1, 8
c int
d *int
)
fmt.Printf("(a+c)*b = %v\n", (a+c)*b) // (1+0)*8=8
fmt.Printf("(a+a)*b/4 = %v\n", (a+a)*b/4) // (1+1)*8/4=4
fmt.Printf("a+5*b/2*2 = %v\n", a+5*b/2*2) // 1+5*8/2*2=41
fmt.Printf("a+b/2*4 = %v\n", a+b/2*4) // 1+8/2*4=17
// %T可直接打印类型
fmt.Printf("d = %v, type=%T\n", d, d) // d = <nil>, type=*int d只声明但没有赋值,因此是nil(nil表示变量未开辟空间)
// &可用于取地址,*可用来解引用,这两是相反的操作,下面看看它们的玩法
fmt.Printf("&c = %v, &d = %v\n", &c, &d) // 先打印地址看看
//fmt.Printf("*d = %v\n", *d) // d是nil,因此这样直接使用会报panic: runtime error: invalid memory address or nil pointer dereference
// 我们尝试修改a
a = 2
fmt.Printf("a = %v\n", a) // 修改成功
*&a = 3 // &a存储的是a变量地址,*&a相当于取址的反向操作,也相当于a赋值为2
// 再次看看a
fmt.Printf("a = %v\n", a) // 修改成功
// 那么d是nil,*d直接空指针,就没办法设置d的值了吗?当然不是,我们来试试
d = &a // 让d指向a的地址,此时d和a都是同一个地址的值,也就是d的值成了3,这是d已经不是nil了
fmt.Printf("&a=%v, d=%v, *d = %v\n", &a, d, *d) // 此时a和d地址相同,值相同
// 下面看看布尔值结合==运算的另一种玩法
var e bool
f := true
f = e == false
// e==false仅是一个条件判断
// 因e为false,则e == false结果为真,所以f=true
fmt.Printf("e = %v, f = %v\n", e, f)
f = e == true // 再看看这个呢
// 因e为false,则e == true结果为假,所以f=false,相当于f被修改为假
fmt.Printf("e = %v, f = %v\n", e, f) // e = false, f = false
// !=也一样
e = f != true
// 因f为false,则f != true为真,得e=true
fmt.Printf("e = %v, f = %v\n", e, f) // e = true, f = false
g := false
e = f != true == g // 这个又怎么玩?
// 因f为false,则f != true为真,真 == g为false,则e=false
fmt.Printf("e = %v, f = %v, g = %v\n", e, f, g)
自己先过一遍,看看结果对不对?speed running:
(a+c)*b = 8
(a+a)*b/4 = 4
a+5*b/2*2 = 41
a+b/2*4 = 17
d = <nil>, type=*int
&c = 0xc0000180b0, &d = 0xc000006028
a = 2
a = 3
&a=0xc000018098, d=0xc000018098, *d = 3
e = false, f = true
e = false, f = false
e = true, f = false
e = false, f = false, g = false
哈哈,觉得好玩是因为有一双发现和制造好玩的手,在较短时间内可以实现书本上好几页、好几处的东西哦!