目录
- 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 指针运算符
- 运算符的优先级
- 控制结构
- If
- For
- Switch
- 小结
运算符
运算符的作用是将操作数组合成表达式,比如下面的代码中,我们通过赋值和加号组成了两个表达式:
var i,j = 1,2 n := i + j
Go的运算符大体分为六种:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和指针运算符。
算术运算符
运算符 | 含义 |
---|---|
+ | 加号,除了用于整数,浮点数,复数外,还可以用于字符串的拼接 |
- | 减号 |
* | 相乘 |
/ | 相除 |
% | 求余,只能用于整数 |
++ | 自增 |
-- | 自减 |
+ | 正数,注意与加号(+)的区别 |
- | 负数,注意与减号(-)的区别 |
用法示例:
var str1 string = "hello" var str2 string = "world" str := str1 + str2 //使用+号拼接字符串 i := 3.2 % 2 //报错,只能对整数求余 var n int = 1 n++ ++n //错误,自增只能加了操作数后面,自减也是同样的
关系运算符
通过逻辑运算符组成的表达式,其计算结果为布尔值,一般用于控制结构的条件部分:
运算符 | 含义 |
---|---|
== | 相等 |
!= | 不相等 |
<= | 小于或等于 |
< | 小于 |
>= | 大于或等于 |
用法示例:
if 2 == (1 + 1) { fmt.Println("相等") }
逻辑运算符
逻辑运算符组成的表达式,其计算结果也同样蝇布尔值,因此也用于控制结构的条件部分:
运算符 | 含义 |
---|---|
&& | 逻辑与 |
|| | 逻辑或 |
! | 逻辑非,一元运算符,具有较高的优先级 |
位运算符
位运算符只能用于整数
运算符 | 含义 |
---|---|
& | 按位与,两个操作数都1的位置为1,否为0 |
| | 按位或,两个操作数只要有1的位置,都为1,否则为0 |
按位异或,两个操作数都相同为0,否则为1 | |
<< | 按位左移 |
>> | 按位右移 |
&^ | 按位清空,根据右边操作数为1的位置,将左边对应位置设为0。 |
用法示例:
fmt.Println(2 & 1) // 00000010 & 00000001,可以看出,没有哪个位置两个操作都为1,因此结果为:00000000 fmt.Println(2 | 1) // 00000010 & 00000001,结果为00000011,也就是3 fmt.Println(2 ^ 1) // 00000010 & 00000001,结果为00000011,也就是3 fmt.Println(1 << 1) //00000001 => 00000010 fmt.Println(2 >> 1) //00000010 => 00000001 fmt.Println(23 &^ 5) 00010111 &^ 00000101 => 00010010
赋值运算符
运算符 | 含义 |
---|---|
= := | 赋值 |
+= | 先将左侧与右侧的操作数相加,再赋值给左边的变量 |
-= | 先将左侧与右侧的操作数相减,再赋值给左边的变量 |
*= | 先将左侧与右侧的操作数相乘,再赋值给左边的变量 |
/= | 先将左侧与右侧的操作数相除,再赋值给左边的变量 |
%= | 先将左侧与右侧的操作数求余,再赋值给左边的变量 |
<<= | 先将左侧的操作数按右侧的操作数向左位移,再将位移结果赋给左边的变量 |
>>= | 先将左侧的操作数按右侧的操作数向右位移,再将位移结果赋给左边的变量 |
&= | 先将左侧与右侧的操作数进行按位与计算,再将计算结果赋给左边的变量 |
!= | 先将左侧与右侧的操作数进行按位或计算,再将计算结果赋给左边的变量 |
^= | 先将左侧与右侧的操作数进行按异或计算,再将计算结果赋给左边的变量 |
指针运算符
运算符 | 含义 |
---|---|
& | 获取变量在内存中的地址 |
* | 声明指针变量 |
运算符的优先级
Go的++与--运算符作用于操作数时形成的是表达式,因此不纳入运算符的优先级中。
在Go语言中,一元运算符具有更高的优先级,如+(正数), -(负数),!(取反),*(指针声明), &(取址)。
而赋值运算符的优先级最低,除了一元运算符以及赋值运算符外,剩下的运算符可以划分为五个优先等级:
优先级 | 运算符 |
---|---|
5 | * / % << >> & &^ |
4 | + - | ^ |
3 | == != < <= >= > |
2 | && |
1 | || |
控制结构
ifforswitch
If
ifif
if
if boolean expression { // do something }
boolean expressiontrueif
if 2 < 10 { fmt.Println("ok") }
boolean expressionif
if initialization;boolean expression{ // do something }
ifboolean expressiontrue
if i = 10;i < 100 { fmt.Println("ok") }
ifelseifelse
if boolean expression{ // do something }else{ // do something }
用法示例:
if i = 11;i < 11{ fmt.Println("ok") }else{ fmt.Println("bad") }
ifelseelse
if boolean expression1 { // do something } else if boolean expression2 { // do something else } else if boolean expression3 { // do something else }else { // catch-all or default }
For
forfor
for condition { //do something }
conditionGowhiledo-whilewhiledo-while
x := 1 for x < 20{ fmt.Println(x) x++ }
conditionfor
for { //do something }
for
for init statement;condition;post statement{ //do something }
用法示例:
for i := 0; i< 10 ;i++ { fmt.Println(i) }
forrangemapPHPforeach
for k,v := range array { //do something }
用法示例:
var a [10]int = [10]int{1,2,3,4,5,6,7,8,9,10} for index,value := range a { fmt.Println(index,value) }
break
for i := 0; i < 10; i++ { if i == 5 { break } fmt.Println(i) }
continue
for i := 0;i<10;i++{ if i == 5 { continue } fmt.Println(i) }
Switch
Switchifswitch
casedefault
switch var1 { case val1: ... case val2: ... default: ... }
用法示例:
var x = 8 switch x { case 8 : fmt.Println("8") case 9 : fmt.Println("9") case 10 : fmt.Println("10") default : fmt.Println("not found") }
breakswitch
casefallthrough
var x = 8 switch x { case 8 : fmt.Println("8") fallthrough case 9 : fmt.Println("9") fallthrough case 10 : fmt.Println("10") default : fmt.Println("not found") }
case 8:fallthroughfallthrough
switchcaseif/elseif
switch { case condition1: ... case condition2: ... default: ... }
用法示例:
x := 10 switch { case x >= 10: fmt.Println("10") case x > 11: fmt.Println("11") default: fmt.Println("not found") }
switch
switch initialization { case condition1: ... case condition2: ... default: ... }
用法示例:
switch x := 10; { case x >= 10: fmt.Println("10") case x > 11: fmt.Println("11") default: fmt.Println("not found") }
type-switchswitchinterface
小结
总结一下,这篇文章主要讲了三点:
1.Go支持的运算符:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 赋值运算符
- 位运算符
- 指针运算符
2.运算符的优化级
3.Go支持的控制结构:
- If语句
- For语句
- Switch语句