零基础 go - 17(运算符)

13 阅读4分钟

go 运算符是一种特殊的符号。通常用于数据运算、比较、赋值等场景。

一、运算符包括

  • 算术运算符:+、-、*、/、%、++、--
  • 关系运算符:==、!=、>、<、>=、<=
  • 逻辑运算符:&&、||、!
  • 位运算符:&、|、^、<<、>>、&^
  • 赋值运算符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=
  • 其他运算符:&(取地址)、*(指针解引用)、<-(通道操作)、...(变参函数)

二、算数运算符

image.png

  • 除法运算符(/)在 Go 中有两种行为:当两个操作数都是整数时,结果也是整数,且会向零取整;当至少有一个操作数是浮点数时,结果是浮点数。
  • 自增(++)和自减(--)运算符只能作为独立的语句使用,不能用于表达式中。
  • 自增、自减只能放在变量名的后面,例如:n++ ,但不能写成 ++n
  • 取模 a%b 本质为 a-a/b*b
package main

import "fmt"

func main() {
    // 整数除法、小数除法
    var n int = 10
    var res = n /4 // 结果为2
    var res2 = 10.0 / 4 // 结果为2.5
    fmt.Println(res, res2)// 2 2.5

    // 自增、自减
    var m int = 5
    m++ // m 变为 6
    m-- // m 变回 5
    // ++m // 错误,不能写成 ++m
    // --m // 错误,不能写成 --m


    // 自增和自减只能独立使用,不能用于表达式中
    // m = m-- // 错误,不能在表达式中使用自增和自减
    // m = m++2 // 错误,不能在表达式中使用自增和自减
    // var x = m++ + 2 // 错误,不能在表达式中使用自增和自减
    // if m++ > 5 { // 错误,不能在条件表达式中使用自增和自减
    // fmt.Println("m is greater than 5")
    // }


    // 取模的本质
    fmt.Println(10 % 3) // 结果为 1 10-(10/3)*3 = 10-(3)*3=10-9=1
    fmt.Println(-10 % 3) // 结果为 -1 -10-(-10/3)*3 = -10-(-3)*3 = -10+9 = -1
    fmt.Println(10 % -3) // 结果为 1 10-(10/(-3))*(-3) = 10-(-3)*(-3) = 10-9=1
    fmt.Println(-10 % -3) // 结果为 -1 -10-(-10/(-3))*(-3) = -10-(3)*(-3) = -10+9=-1
}

三、关系运算符

Go 语言中的关系运算符用于比较两个值,并返回一个布尔值(true 或 false),通常用于 if 结构或者循环结构的条件中

image.png

package main

import "fmt"

func main() {
    var a int = 10
    var b int = 11
    fmt.Println(a == b) // false
    fmt.Println(a != b) // true
    fmt.Println(a > b) // false
    fmt.Println(a < b) // true
    fmt.Println(a >= b) // false
    fmt.Println(a <= b) // true
}

四、逻辑运算符

Go 语言中的逻辑运算符用于连接多个条件表达式,并返回一个布尔值(true 或 false)

image.png

  • && 也叫短路与,只要第一个条件为 false,整个表达式就为 false,后面的条件将不再被计算。
  • || 也叫短路或,只要第一个条件为 true,整个表达式就为 true,后面的条件将不再被计算。
package main

import "fmt"


func test() bool {
    fmt.Println("test function called")
    return true
}


func main() {
    var a int = 10
    var b int = 20
    fmt.Println(a > 5 && b > 15) // true
    fmt.Println(a > 5 || b < 15) // true
    fmt.Println(!(a > 5)) // false


    // 短路与: test()函数不会被调用,因为a < 5 已经为 false
    if a < 5 && test() {
        fmt.Println("条件满足")
    }

    // 短路或:test()函数不会被调用,因为 a > 5 已经为 true
    if a > 5 || test() {
        fmt.Println("条件满足")
    }

}

五、赋值运算符

Go 语言中的赋值运算符用于将一个值赋给一个变量,或者在原有的基础上进行运算后再赋值

image.png

  • 运算顺序是从右往左
  • 赋值运算的左边只能是变量,右边可以是一个表达式、变量、常量等
package main

import "fmt"

func main() {
    var a int = 10
    a += 5 // a 变为 15
    a -= 3 // a 变为 12
    a *= 2 // a 变为 24
    a /= 4 // a 变为 6
    a %= 4 // a 变为 2
    a <<= 1 // a 变为 4 (左移一位,相当于乘以2)
    a >>= 1 // a 变为 2 (右移一位,相当于除以2)
    a &= 1 // a 变为 0 (按位与运算)
    a |= 2 // a 变为 2 (按位或运算)
    a ^= 3 // a 变为 1 (按位异或运算)


    // 交换两个变量值,不使用中间变量
    var m int = 1
    var n int = 2
    m = m + n // m 变为 3
    n = m - n // n 变为 1
    m = m - n // m 变为 2
    // 可以简写为下面
    // m, n = n, m // m 变为 2,n 变为 1
}

六、位运算符

image.png

七、其他运算符

image.png

八、注意

  • go 不支持三元运算符

九、运算符的优先级

Go 语言中的运算符优先级决定了在一个表达式中多个运算符出现时,哪个运算符先被计算。以下是 Go 语言中常见的运算符按照优先级从高到低的顺序排列:

image.png

  • 括号运算符:()、[]、{}、.、->(函数调用、数组索引、结构体字段访问等)
  • 一元运算符:+、-、!、^、&(取地址)、*(指针解引用)、<-(通道操作)
  • 算术运算符:*、/、%、+、-
  • 位运算符:<<、>>、&、|、^、&^
  • 关系运算符:==、!=、>、<、>=、<=
  • 逻辑运算符:&&、||
  • 赋值运算符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=
  • 其他运算符:...(变参函数)