8.14Go之运算符(Operator)
Go内置运算符
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
其他运算符
算术运算符、关系运算符、逻辑运算符因为是类C语言,所以和之前的运算符基本无异。重点介绍位运算符、赋值运算符、其他运算符
逻辑运算符
| 运算符 | 描述 | 
|---|---|
| && | 逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。 | 
| || | 逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。 | 
| ! | 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 | 
示例:
package main
import "fmt"
func main() {
    a := true
    b := false
    if a && b {
        fmt.Println("第一行条件为 ture\n")
    }
    if a || b {
        fmt.Println("第二行条件为 false\n")
    }
    /*修改a和b赋值*/
    a = b
    b = true
    if a && b {
        fmt.Println("第三行条件为 true\n")
    }else {
        fmt.Println("第三行条件为 false\n")
    }
    if !(a && b) {
        fmt.Println("第四行条件为 true\n")
    }
}
/*
这里体现了go语言的语法简洁性
if后不需要硬性加"()"
*/
位运算符
作用:
- 
对整数在内存中的二进制位进行操作 
| 运算符 | 描述 | 
|---|---|
| & | 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。简单理解就是将左右两边的数转成二进制数然后比较,两位都是1的时候才为1 | 
| | | 按位或运算符"|"是双目运算符,功能是参与运算的两数各对应的二进制位相或。将左右两边的数转成二进制数然后比较,两位有一位为1的时候就是1 | 
| ^ | 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。将左右两边的数转成二进制数然后比较,两位不一样则为1 | 
| << | 左移n位就是乘以2的n次方。 “a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。 | 
| >> | 右移n位就是除以2的n次方。 “a>>b”是把a的各二进位全部右移b位。 | 
示例:
package main
import "fmt"
func main() {
    a := 60
    b := 13
    c := 0
    c = a & b
    fmt.Println("第一行 -c 的值为 %d\n", c)
    c = a | b
    fmt.Println("第二行 -c 的值为 %d\n", c)
    c = a ^ b
    fmt.Println("第三行 -c 的值为 %d\n", c)
    c = a << 2
    fmt.Println("第四行 -c 的值为 %d\n", c)
    c = a >> 2
    fmt.Println("第五行 -c 的值为 %d\n", c)
}
赋值运算符
是赋值符号 + 运算符
| 运算符 | 描述 | 
|---|---|
| = | 将一个表达式的值赋给一个左值 | 
| += | 相加后再赋值--->C += A 等于 C = C + A | 
| -= | 相减后再赋值 | 
| *= | 相乘后再赋值 | 
| /= | 相除后再赋值 | 
| %= | 求余后再赋值 | 
| <<= | 左移后赋值 | 
| >>= | 右移后赋值 | 
| &= | 按位与后赋值 | 
| ^= | 按位异或后赋值 | 
| |= | 按位或后赋值--->C |=2 等于 C = C|2 | 
示例:
package main
import "fmt"
var (
    practiceValueNo1 int
    practiceValueNo2 int
    practiceValueNo3 int
)
func main() {
    practiceValueNo1, practiceValueNo2 = 60 ,13
    practiceValueNo3 = practiceValueNo1 + practiceValueNo2
    fmt.Println(practiceValueNo3)
    practiceValueNo1 += practiceValueNo2
    fmt.Println(practiceValueNo1)
    practiceValueNo1 -= practiceValueNo2 //practiceValueNo1 -= practiceValueNo2--->practiceValueNo1 = practiceValueNo1 - practiceValueNo2
    fmt.Println(practiceValueNo1)
    practiceValueNo2 = 2
    practiceValueNo1 *= practiceValueNo2
    fmt.Println(practiceValueNo1)
    practiceValueNo2 = 30
    practiceValueNo1 /= practiceValueNo2
    fmt.Println(practiceValueNo1)
    practiceValueNo2 = 16
    practiceValueNo1 %= practiceValueNo2
    fmt.Println(practiceValueNo1)
    practiceValueNo2 = 2
    practiceValueNo1 <<= practiceValueNo2
    fmt.Println(practiceValueNo1)
    practiceValueNo1 >>= practiceValueNo2
    fmt.Println(practiceValueNo1)
    practiceValueNo2 = 13
    practiceValueNo1 &= practiceValueNo2
    fmt.Println(practiceValueNo1)
    practiceValueNo1 ^= practiceValueNo2
    fmt.Println(practiceValueNo1)
    practiceValueNo1 |= practiceValueNo2
    fmt.Println(practiceValueNo1)
}
其他运算符--->这是go非常关键的地方(也是go与Java的不同之处)
| 运算符 | 描述 | 实例 | 
|---|---|---|
| & | 返回变量存储地址 | &a; 将给出变量的实际地址。 | 
| * | 指针变量。 | *a; 是一个指针变量 | 
示例:
package main
import "fmt"
var (
    variableValueNo1 int
    variableValueNo2 int32
    variableValueNo3 float32
    variableValueNo4 int
    pointer *int
    pointerNo2 *int32
)
func main() {
    variableValueNo1 = 60
    fmt.Println("第一行 -a 变量类型为 = %T\n", variableValueNo1)
    fmt.Println("第二行 -b 变量类型 = %T\n", variableValueNo2)
    fmt.Println("第三行 -c 变量类型 = %T\n", variableValueNo3)
    pointer = &variableValueNo1 //'pointer'包含了变量variableValueNo1的地址
    fmt.Println("a 的值为 %d\n", variableValueNo1)
    fmt.Println("*pointer为 %d\n", *pointer)
    /*修改pointer的指向*/
    //初始化No4
    variableValueNo4 = 30
    pointer = &variableValueNo4
    fmt.Println("变量variableValueNo4的内存地址为:\n", pointer)
    variableValueNo2 = 30
    pointerNo2 = &variableValueNo2
    fmt.Println(*pointerNo2)
    /*
    注意:
    如果在指针变量前+*符号,那么打印出来的结果是这个变量指向的地址的值对象本身
    不+*符号,打印出来的结果是值对象的地址
    */
}
如果我改变指针指向:
    pointer = &variableValueNo1 //'pointer'包含了变量variableValueNo1的地址
    /*如果在这改变指针的指向,那么结果为0*/
    pointer = &variableValueNo4
    fmt.Println("a 的值为 %d\n", variableValueNo1)
    fmt.Println("*pointer为 %d\n", *pointer)
//因为我改变了pointer指针地址的指向,variableValueNo4在此时值对象为0(默认的值对象)
输出结果:
注意:
    It's a lonely road!!!
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号