一、运算符在Go中的特殊说明
Golang中运算符使用和C、Java差别不大,唯一需要注意的是,自增自减运算符(“++”,“--”)只能作为独立语言使用,具体示例如下:
package main
import "fmt"
func main(){
var i int = 0
i++ //单独成行,不可成为其他语句的组成
i--
var a int
a = i++ //错误,自增语句只能独立使用
a = i-- //错误,自减语句只能独立使用
if i++ > 0 { //错误,同样,不能作为条件判断的某一比较项
fmt.Println("i=",i)
}
}
更重要的是,在Golang中,++、--只能够写在变量的后面,不能写在变量的前面,不存在++i,--i的写法,设计者的目的是为了强制让Golang更加简洁,统一。
另外,Golang中是没有三元运算符A?B:C的,其具体效果通过if实现。
同样的,算符的优先级与C语言类似。
附:Golang中各类常见运算符:算术运算符、关系运算符、逻辑运算符、位运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | -2 | -2 |
+ | 加 | 4+1 | 5 |
- | 减 | 4-1 | 3 |
* | 乘 | 4*2 | 8 |
/ | 除 | 10/5 | 2 |
% | 取模 | 7%5 | 2 |
++ | 自增 | a=2 a++ | a=3 |
-- | 自减 | a=2 a-- | a=1 |
+ | 字符串相加 | "Wel"+"come" | "Welcome" |
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
== | 相等于 | 4==3 | false |
!= | 不等于 | 4!=3 | true |
< | 小于 | 4<3 | false |
> | 大于 | 4>3 | true |
<= | 小于等于 | 4<=3 | false |
>= | 大于等于 | 4>=3 | true |
运算符 | 描述 | 实例(A为True,B为False) |
---|---|---|
&& | 逻辑与,短路与 | (A&&B)为False |
|| | 逻辑或,短路或 | (A||B)为True |
! | 逻辑非 | !A为False |
运算符 | 描述 |
---|---|
& | 按位与,将参与运算的两数对应二进制位相与 |
| | 按位或,将参与运算的两数对应二进制位相或 |
^ | 按位异或,将参与运算的两数对应二进制位相异或 |
<< | 左移,例:a<<x,将a左移x位,高位丢弃,低位补0 |
>> | 右移,例:a>>x,将a右移x位,低位丢弃,高位补0 |
运算符 | 描述 | 实例 |
---|---|---|
= | 赋值运算 | C = A+B |
+= | 相加后赋值 | C += A 相当于C = C + A |
-= | 相减后赋值 | C -= A 相当于 C = C - A |
*= | 相乘后赋值 | C *= A 相当于 C = C * A |
/= | 相除后赋值 | C /= A 相当于 C = C / A |
%= | 求余后赋值 | C %= A 相当于 C = C % A |
<<= | 左移后赋值 | C <<= 2 相当于 C = C << 2 |
>>= | 右移后赋值 | C >>= 2 相当于 C = C >> 2 |
&= | 按位与后赋值 | C &= 2 相当于 C = C & 2 |
^= | 按位异或后赋值 | C ^= 2 相当于 C = C ^ 2 |
|= | 按位或后赋值 | C |= 2 相当于 C = C | 2 |
运算符 | 描述 | 实例 |
---|---|---|
& | 返回变量存储地址,取地址符 | &a;给出变量a的实际地址 |
* | 指针变量 | *a;是一个指针变量 |
二、程序流程控制在GO中的特殊说明
Golang中没有while和do…while!!!!!!
与C语言的流程控制语句类似,Golang中有if、else、switch、case、goto、for、break、continue等流程控制语句,但是,Golang中没有while和do…while!!!!!!(可以用for循环和break跳转语句来实现相应效果)
1、Go中的if,if…else
if条件表达式外不用加括号,用空格与其他词语隔开。if…else控制的代码块一定要用花括号括住,不能省略,并且else必须紧接在反花括号后,不能够换行,其余使用方法与C类似。另外,可以在条件表达式里进行变量的定义
语法示例如下:
if 条件表达式A {
//执行语句
} else if 条件表达式B {
//执行语句
} else {
//执行语句
}
//没有括号、else紧跟花括号不换行
定义变量实例:
if age := 20; age > 18{
//执行语句
}
golang支持在if中直接定义一个变量
2、Go中的switch…case
喜报,喜报,case分支后不需要再加break了!!!
其余和if一样,表达式不需要用括号括住了,用空格隔开,并且支持case里有多个表达式,用逗号隔开,switch后面也可以不带表达式,类似if…else分支使用。
switch 表达式{
case 表达式1,表达式2,…:
//执行语句
case 表达式3,表达式4,…:
//执行语句
……
default:
//执行语句
}
还存在switch穿透(fallthrough),如果在case语句后面加上fallthrough,则执行完该case还会继续执行下一个case,叫做switch穿透,但默认只能穿透一层。可以尝试如下代码:
var i int = 10
switch i {
case 10:
fmt.Println("case1")
fallthrough
case 20:
fmt.Println("case2")
case 30:
fmt.Println("case3")
default:
fmt.Println("no case")
}
另外,switch还能够用于type…switch来判断某个interface变量中实际指向的变量类型,可以尝试如下代码。
var x interface{}
var y = 10.0
x = y
switch i := x.(type){
case nil:
fmt.Printf("x 的类型是:%T",i)
case int:
fmt.Printf("x 的类型是int")
case float64:
fmt.Printf("x 的类型是float64")
case func(int) float64:
fmt.Printf("x 的类型是func(int)")
case bool,string:
fmt.Printf("x 的类型是bool或string")
default:
fmt.Printf("x 的类型未知")
}
3、Go中的for循环
Go中for循环有三种使用方式,其格式分别如下:
第一种:
for 循环变量初始化; 循环条件; 循环变量迭代{
//循环执行语句
}
示例如下:
for i:= 1; i <= 10; i++{ fmt.Println(i); }
第二种:
for 循环判断条件{
//循环执行语句
}
示例如下:
j := 1 for j<=10{ fmt.Println(j) j++ }
第三种:
for {//循环执行语句
}
示例如下:
k := 1 for { if k <=10 { fmt.Println(k) }else{ break } k++ }
这种用法可以用于实现do…while和while循环操作,因为这两个循环关键词在Go中是没有的,具体实现效果见后文。
另外,Golang提供for-range方式,用于方便遍历字符串和数组,以下为字符串遍历方式:
str = "Hi bro!" for index, val := range str{ fmt.Printf("index=%d,val=%c \n", index, var) }
因为Golang中是不存在while和do…while关键字的,故用for循环来实现while和do…while:
//while循环
for{
if 循环条件表达式{
break // 跳出for循环
}
//循环执行语句
//循环变量迭代
}
//do…while循环
for{
//循环操作(语句)
//循环变量迭代
if 循环条件表达式{
break;//跳出for循环
}
}
其余的关于break、continue以及goto的用法与C语言类似,break同样是结束当前循环体,continue同样是直接跳转下一次循环,goto同样不推荐使用,故不做赘述。