Go的运算符

1 算术运算符

运算符

术语

示例

结果

+

10 + 5

15

-

10 - 5

5

*

10 * 5

50

/

10 / 5

2(值取整数位,要想带小数为,则10.0/5=2.0)

%

取模(取余)

10 % 3

1(取模公式:a-a/b*b)

++

后自增,没有前自增

(单独语句,并不是运算符)

a=0; a++

a=1

--

后自减,没有前自减

(单独语句,并不是运算符)

a=2; a--

a=1

2 关系运算符

运算符

术语

示例

结果

==

相等于

4 == 3

false

!=

不等于

4 != 3

true

<

小于

4 < 3

false

>

大于

4 > 3

true

<=

小于等于

4 <= 3

false

>=

大于等于

4 >= 1

true

3 逻辑运算符

运算符

术语

示例

结果

!

!a

如果a为假,则!a为真;

如果a为真,则!a为假。

&&

a && b

如果a和b都为真,则结果为真,否则为假。

||

a || b

如果a和b有一个为真,则结果为真,二者都为假时,结果为假。

package main

import "fmt"

func main(){
    fmt.Println("4>3 结果:", 4>3)
    fmt.Println("4!=3 结果", 4!=3)

    fmt.Println("!(4>3) 结果:", !(4>3))
    fmt.Println("!(4!=3) 结果", !(4!=3))

    //&& 与,并且, 左边右边都为真,结果才为真
    fmt.Println("true && true 结果:", true && true)
    fmt.Println("true && false 结果:", true && false)

    // || 或 左边和右边都为假的时候,结果才为假,其他都为真
    fmt.Println("true || false 结果:", true || false)
    fmt.Println("false || false 结果:", false || false)

    a := 10
    // fmt.Println("0<a<=10 结果为:", 0<a<=10)  //go中不支持这种连写,python支持
    fmt.Println("0<a && a <=10 的结果:", 0<a && a <=10)
}

4 位运算符

运算符

术语

说明

示例

&

按位与

参与运算的两数各对应的二进位相与(两位都为1则为1)

60 & 13 结果为12

|

按位或

参与运算的两数各对应的二进位相或(两位有一个为1就为1)

60 | 13 结果为61

^

异或

参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1(两位不一样则为1)

60 ^ 13 结果为240

<<

左移

左移n位就是乘以2的n次方。

“a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。

4 << 2 结果为16

>>

右移

右移n位就是除以2的n次方。

“a>>b”是把a的各二进位全部右移b位。

4 >> 2 结果为1

//权限设计

100   ---4  r
010   ---2  w
001   ---1  x

100|010 = 110   //增加权限
110&100 = 100   //验证权限
110^100 = 010   // 删除权限
const (
        _  = iota
        KB = 1 << (10 * iota)
        MB = 1 << (10 * iota)
        GB = 1 << (10 * iota)
        TB = 1 << (10 * iota)
        PB = 1 << (10 * iota)
    )

5 赋值运算符

运算符

说明

示例

=

普通赋值

c = a + b 将 a + b 表达式结果赋值给 c

+=

相加后再赋值

c += a 等价于 c = c + a

-=

相减后再赋值

c -= a 等价于 c = c - a

*=

相乘后再赋值

c *= a 等价于 c = c * a

/=

相除后再赋值

c /= a 等价于 c = c / a

%=

求余后再赋值

c %= a 等价于 c = c % a

<<=

左移后赋值

c <<= 2 等价于 c = c << 2

>>=

右移后赋值

c >>= 2 等价于 c = c >> 2

&=

按位与后赋值

c &= 2 等价于 c = c & 2

^=

按位异或后赋值

c ^= 2 等价于 c = c ^ 2

|=

按位或后赋值

c |= 2 等价于 c = c | 2

6 其他运算符

运算符

术语

示例

说明

&

取地址运算符

&a

变量a的地址

*

取值运算符

*a

指针变量a所指向内存的值

7 运算符优先级

在Go语言中,一元运算符拥有最高的优先级,二元运算符的运算方向均是从左至右。

下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:

优先级

运算符

7

^ !

6

* / % << >> & &^

5

+ - | ^

4

== != < <= >= >

3

<-

2

&&

1

||

练习题:

有一堆数字,其他数字都出现了两次,只有一个出现了一次,找出这个数字

func main() {
    var ret int
    s1 := [...]int{1,1,2,2,3,4,4,5,6,5,6}
    for _,i := range s1{
        ret ^= i
    }
    fmt.Println(ret)
}