8.14Go之运算符(Operator)

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(默认的值对象)

输出结果:

结果图

注意:

  • go是强类型语言,即便同是int类型下的指针,指针变量pointer *int无法指向变量variableValueNo2 int32

原文地址:https://www.cnblogs.com/JunkingBoy/p/15141440.html