Go运算符

112 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

算术运算符分析

算术运算符分析

1. 结构:

变量3 := 变量1 + 变量2

结构分解:img

解析: 该算术语句中使用短类型声明(:=)在语句编译过程中先获取一个变量3的数据存储位置(即语句经过算术运算后所得的新数据存储地址),再通过算术运算符的特性(只对数值类型的变量进行运算)将变量1和变量2的数值相加,所得的新结果再赋值给变量3,并存储到新地址中从而完成整个计算。

算数运算符一览:

算术运算符是对数值类型的变量进行运算的,比如:加减乘除。

运算符描述
+相加
-相减
*相乘
/相除
%求余
++自增
--自减

2. 举例: 声明三个整形类型变量,三者之间进行交互运算并输出结果。

 var a1, a2, a3 = 1, 2, 3                                               //变量的赋值
 a4 := a1 + a2                                                       //变量的运算
 a5 := a1 + a2*a3
 a6 := a1 + a2/a3
 fmt.Println(a4, a5, a6)                                               //语句&表达式输出

终端输出:img

结构解析:

 var a1, a2, a3 = 1, 2, 3                                               //变量的赋值

变量赋值:在Go语言中给变量的赋值可以分为三个阶段,先创建变量,在内存中开辟空间后再初始化变量,将变量初始化为underfined,最后再进行真正赋值。

 a4 := a1 + a2                                                      //变量的算术运算
 a5 := a1 + a2*a3
 a6 := a1 + a2/a3

变量的算术运算:在go语言中, 通过算术运算符的特性(只对数值类型的变量进行运算)将初始化赋值的变量进行算术运算,得到新的数值赋值给临时变量,并存储到新地址中从而完成整个计算。

 fmt.Println(a4, a5, a6)                                             //语句&表达式输出

语句&表达式输出:fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。函数内语句依照main函数内依次执行。

赋值运算符分析

赋值运算符分析

1. 结构:

变量 运算符 值

结构分解:img

解析: 在Go语言中,赋值运算符使用时,通过将经过运算后的值或者是直接赋值的数据赋给指定的变量。

赋值一览表:赋值运算符就是将某个运算后的值,赋给指定的变量。

运算符描述
=简单的赋值运算符,将一个表达式的值赋给一个左值
+=相加后再赋值
-=相减后再赋值
*=相乘后再赋值
/=相除后再赋值
%=求余后再赋值
<<=左移后赋值
>>=右移后赋值
&=按位与后赋值
^=按位异或后赋值
=按位或后赋值

2. 举例: 现有两个变量,a 和 b,要求将其进行交换,最终打印结果。

 a := 2018                                                       //变量的初始化赋值
 b := 2022
 num := a                                                       //运算符的交换赋值
 a = b
 b = num
 fmt.Printf("交换后 a = %v b = %v\n", a, b)                           //语句&表达式输出

终端输出: img

结构解析:

 a := 2018                                                       //变量的初始化赋值
 b := 2022     

变量的初始化赋值: Go语言是静态类型语言,因此变量(variable)是有明确类型的。编译器会检查函数调用中,变量类型的正确性。在数学概念中,变量表示没有固定值且可改变的数。但从计算机系统实现角度来看,变量是一段或多段用来存储数据的内存。在此语句中通过短类型声明将变量声明并指定出变量数据存储的空间,然后通过赋值运算符将数值赋值给变量。

 num := a                                                      //赋值运算符的赋值
 a = b
 b = num

赋值运算符赋值: 通过运算符的特性将经过运算后的值或者是直接赋值的数据赋给指定的变量。

  fmt.Printf("交换后 a = %v b = %v\n", a, b)                       //语句&表达式输出(函数体)

函数体: 在函数中具有实现指定功能的代码块即为函数的函数体,在此函数体中实现的功能就是打印输出返回的结果,Println 函数是属于包 fmt 的函数。

关系运算符(比较运算符)分析

1. 结构:

变量 比较运算符 变量

结构分解: img

解析: 关系运算符也叫比较运算符,在Go语言中,关系运算符的结果都是bool型,也就是运算的结果要么是ture,要么是false,而通过关系运算符形成的关系表达式经常用在if结构的条件中或循环结构的条件中。

关系运算符一览:

运算符描述
==检查两个值是否相等,如果相等返回 True 否则返回 False。
!=检查两个值是否不相等,如果不相等返回 True 否则返回 False。
检查左边值是否大于右边值,如果是返回 True 否则返回 False。
<检查左边值是否小于右边值,如果是返回 True 否则返回 False。
>=检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。
<=检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。

2. 举例: 声明两个变量后再用关系运算符进行比较运算。

var a1, a2 = 1, 2                                                //变量的初始化赋值
fmt.Println(a1 == a2)                                           //语句&表达式输出

终端输出:img

结构分解:

var a1, a2 = 1, 2                                                //变量的初始化赋值

变量的初始化赋值: Go语言是静态类型语言,因此变量(variable)是有明确类型的。编译器会检查函数调用中,变量类型的正确性。在数学概念中,变量表示没有固定值且可改变的数。但从计算机系统实现角度来看,变量是一段或多段用来存储数据的内存。在此语句中通过元组变量声明并指定出变量数据存储的空间,然后通过赋值运算符将数值赋值给变量。

fmt.Println(a1 == a2)                                            //语句&表达式输出

语句&表达式输出: 在函数中具有实现指定功能的代码块即为函数的函数体,在此函数体中实现的功能就是打印输出返回的结果,Println 函数是属于包 fmt 的函数。在表达式输出的过程中关系运算符实现比较运算,然后输出bool类型的结果。

扩展: 如果我们将关系运算符中的**==换成=**时是否会产生相同的比较效果?

fmt.Println(a1 = a2)                                            //语句&表达式输出

终端输出:img

输出分析: 在函数中具有实现指定功能的代码块即为函数的函数体,在此函数体中实现的功能就是打印输出返回的结果,Println 函数是属于包 fmt 的函数。在表达式输出的过程中关系运算符实现比较运算,然后输出bool类型的结果。然而将**==换成=时,表达式中的a1 = a2表达的意思时将变量a2的值赋值给变量a1**,而不是将两个变量进行比较输出。

结论:因此关系运算符中的运算符==不能换写成运算符=。

逻辑运算符分析

1. 结构:

变量 逻辑运算符 变量

结构分解:img

解析: 逻辑运算符用于连接多个条件(条件一般为关系表达式),最终的结果也是一个bool值。而在此结构中逻辑运算符&& 也叫短路与,它代表的是如果第一个条件为false,则第二个条件不会判断,最终结果为false.与之对应的还有一个逻辑运算符|| 如果第一个条件为true,则第二个条件不会进行判断,最终结果为true.

关系运算符一览:

img

2. 举例:当前有一个变量赋值为2018,当赋值大于2010小于2022年时则会输出“知链科技”。

var age int = 2018                                               //变量的初始化赋值
if age > 2010 && age < 2022 {                                    //逻辑表达式判断
   fmt.Println("知链科技")                                           //语句&表达式输出
}

结构分解:

var age int = 2018                                               //变量的初始化赋值

变量赋值:在Go语言中变量通过等号“=” 来赋值,通过“=”可以将指定的数据指给变量,从而使变量表示这个数据相应的内存地址,在之后的数据流转操作的过程中,通过使用变量操作,让变量所对应的数据进行交互处理从而完成数据的各类处理。

if age > 2010 && age < 2022 {                                    //逻辑表达式判断
   fmt.Println("知链科技")                                           //语句&表达式输出
}

逻辑语句&表达式输出:逻辑语句表达式进行if判断,当条件满足时,逻辑语句运行成功,则函数体内的fmt.Println(...) 将字符串输出到控制台,并在最后自动增加换行字符 \n。函数内语句依照main函数内依次执行。

运算符优先级分析

1. Go语言运算符优先级和结合性一览表:

优先级分类运算符结合性
1逗号运算符,从左到右
2赋值运算符=、+=、-=、*=、/=、 %=、 >=、 <<=、&=、^=、=从右到左
3逻辑或从左到右
4逻辑与&&从左到右
5按位或从左到右
6按位异或从左到右
7按位与&从左到右
8相等/不等==、!=从左到右
9关系运算符<、<=、>、>=从左到右
10位移运算符<<、>>从左到右
11加法/减法+、-从左到右
12乘法/除法/取余*(乘号)、/、%从左到右
13单目运算符!、*(指针)、& 、++、--、+(正号)、-(负号)从右到左
14后缀运算符( )、[ ]、->从左到右

释义: 有些运算符拥有较高的优先级,二元运算符的运算方向均是从左至右。只有单目运算,赋值运算是从右往左运算的。

2. 举例: 有三个变量x,y和z,当它们通过交互运算后得到新的结果再赋值的给变量sum再进行输出。

var x = 8                                                        //变量的声明
var y = 8
var z = 7
sum := (x + y) * z                                             //变量的运算赋值
fmt.Printf("赋值后sum= %v", sum)                              //语句&表达式输出

终端输出:img

结构分析:

var x = 8                                                       //变量的声明
var y = 8
var z = 7

变量的声明赋值: Go语言是静态类型语言,因此变量(variable)是有明确类型的。编译器会检查函数调用中,变量类型的正确性。在数学概念中,变量表示没有固定值且可改变的数。但从计算机系统实现角度来看,变量是一段或多段用来存储数据的内存。

sum := (x + y) * z                                                //变量的运算赋值

变量的运算赋值: 在Go语言中,运算符优先级,是描述在计算机运算计算表达式时执行运算的先后顺序。 先执行具有较高优先级的运算,然后执行较低优先级的运算。运算符优先级的大致顺序为:单目运算符 > 算术运算符 > 位移运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 ,在此语句中,先对优先级高的变量相加,再将得到的结果与优先级较低的乘法进行运算,获得结果后赋值给变量sum。

fmt.Printf("赋值后sum= %v", sum)                                  //语句&表达式输出(函数体语句)

函数体语句: 在函数中具有实现指定功能的代码块即为函数的函数体,在此函数体中实现的功能就是打印输出返回的结果,Println 函数是属于包 fmt 的函数。

}

大括号 } 表示 main 函数体的结束。