重學Go語言之運算符與控制結(jié)構(gòu)詳解
運算符
運算符的作用是將操作數(shù)組合成表達式,比如下面的代碼中,我們通過賦值和加號組成了兩個表達式:
var i,j = 1,2 n := i + j
Go的運算符大體分為六種:算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符、賦值運算符和指針運算符。
算術(shù)運算符
| 運算符 | 含義 |
|---|---|
| + | 加號,除了用于整數(shù),浮點數(shù),復(fù)數(shù)外,還可以用于字符串的拼接 |
| - | 減號 |
| * | 相乘 |
| / | 相除 |
| % | 求余,只能用于整數(shù) |
| ++ | 自增 |
| -- | 自減 |
| + | 正數(shù),注意與加號(+)的區(qū)別 |
| - | 負數(shù),注意與減號(-)的區(qū)別 |
用法示例:
var str1 string = "hello" var str2 string = "world" str := str1 + str2 //使用+號拼接字符串 i := 3.2 % 2 //報錯,只能對整數(shù)求余 var n int = 1 n++ ++n //錯誤,自增只能加了操作數(shù)后面,自減也是同樣的
關(guān)系運算符
通過邏輯運算符組成的表達式,其計算結(jié)果為布爾值,一般用于控制結(jié)構(gòu)的條件部分:
| 運算符 | 含義 |
|---|---|
| == | 相等 |
| != | 不相等 |
| <= | 小于或等于 |
| < | 小于 |
| >= | 大于或等于 |
用法示例:
if 2 == (1 + 1) {
fmt.Println("相等")
}邏輯運算符
邏輯運算符組成的表達式,其計算結(jié)果也同樣蠅布爾值,因此也用于控制結(jié)構(gòu)的條件部分:
| 運算符 | 含義 |
|---|---|
| && | 邏輯與 |
| || | 邏輯或 |
| ! | 邏輯非,一元運算符,具有較高的優(yōu)先級 |
位運算符
位運算符只能用于整數(shù)
| 運算符 | 含義 |
|---|---|
| & | 按位與,兩個操作數(shù)都1的位置為1,否為0 |
| | | 按位或,兩個操作數(shù)只要有1的位置,都為1,否則為0 |
| 按位異或,兩個操作數(shù)都相同為0,否則為1 | |
| << | 按位左移 |
| >> | 按位右移 |
| &^ | 按位清空,根據(jù)右邊操作數(shù)為1的位置,將左邊對應(yīng)位置設(shè)為0。 |
用法示例:
fmt.Println(2 & 1) // 00000010 & 00000001,可以看出,沒有哪個位置兩個操作都為1,因此結(jié)果為:00000000 fmt.Println(2 | 1) // 00000010 & 00000001,結(jié)果為00000011,也就是3 fmt.Println(2 ^ 1) // 00000010 & 00000001,結(jié)果為00000011,也就是3 fmt.Println(1 << 1) //00000001 => 00000010 fmt.Println(2 >> 1) //00000010 => 00000001 fmt.Println(23 &^ 5) 00010111 &^ 00000101 => 00010010
賦值運算符
| 運算符 | 含義 |
|---|---|
| = := | 賦值 |
| += | 先將左側(cè)與右側(cè)的操作數(shù)相加,再賦值給左邊的變量 |
| -= | 先將左側(cè)與右側(cè)的操作數(shù)相減,再賦值給左邊的變量 |
| *= | 先將左側(cè)與右側(cè)的操作數(shù)相乘,再賦值給左邊的變量 |
| /= | 先將左側(cè)與右側(cè)的操作數(shù)相除,再賦值給左邊的變量 |
| %= | 先將左側(cè)與右側(cè)的操作數(shù)求余,再賦值給左邊的變量 |
| <<= | 先將左側(cè)的操作數(shù)按右側(cè)的操作數(shù)向左位移,再將位移結(jié)果賦給左邊的變量 |
| >>= | 先將左側(cè)的操作數(shù)按右側(cè)的操作數(shù)向右位移,再將位移結(jié)果賦給左邊的變量 |
| &= | 先將左側(cè)與右側(cè)的操作數(shù)進行按位與計算,再將計算結(jié)果賦給左邊的變量 |
| != | 先將左側(cè)與右側(cè)的操作數(shù)進行按位或計算,再將計算結(jié)果賦給左邊的變量 |
| ^= | 先將左側(cè)與右側(cè)的操作數(shù)進行按異或計算,再將計算結(jié)果賦給左邊的變量 |
指針運算符
| 運算符 | 含義 |
|---|---|
| & | 獲取變量在內(nèi)存中的地址 |
| * | 聲明指針變量 |
運算符的優(yōu)先級
Go的++與--運算符作用于操作數(shù)時形成的是表達式,因此不納入運算符的優(yōu)先級中。
在Go語言中,一元運算符具有更高的優(yōu)先級,如+(正數(shù)), -(負數(shù)),!(取反),*(指針聲明), &(取址)。
而賦值運算符的優(yōu)先級最低,除了一元運算符以及賦值運算符外,剩下的運算符可以劃分為五個優(yōu)先等級:
| 優(yōu)先級 | 運算符 |
|---|---|
| 5 | * / % << >> & &^ |
| 4 | + - | ^ |
| 3 | == != < <= >= > |
| 2 | && |
| 1 | || |
控制結(jié)構(gòu)
Go的控制結(jié)構(gòu)包括if語句、for語句和switch語句三種。
If
if語句用于判斷某個條件是否滿足,如果滿足,則執(zhí)行if語句中的代碼塊,如果不滿足,則忽略if語句中的代碼塊并繼續(xù)向后執(zhí)行。
最簡單的if語句結(jié)構(gòu)為:
if boolean expression {
// do something
}其中boolean expression為一個可以得到布爾值的表達式,當布爾值為true,會執(zhí)行if語句中的代碼塊,如:
if 2 < 10 {
fmt.Println("ok")
}除了用于判斷的boolean expression外,if也可以包含一個初始化表達式:
if initialization;boolean expression{
// do something
}這種情況下,if會先執(zhí)行初始化表達式,之后再判斷boolean expression得到的布爾是否為true:
if i = 10;i < 100 {
fmt.Println("ok")
}if語句后面也可以跟上else語句,當然if條件不滿足時,會執(zhí)行else語句中的代碼塊:
if boolean expression{
// do something
}else{
// do something
}用法示例:
if i = 11;i < 11{
fmt.Println("ok")
}else{
fmt.Println("bad")
}如果有多個分支條件判斷,可以在if語句后面跟上多個else if 語句,最后可以跟上else語句,當所有條件都不滿足時,會執(zhí)行else語句中的代碼塊:
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
for語句用于根據(jù)條件循環(huán)執(zhí)行其中的代碼塊,最簡單的for語句格式如下:
for condition {
//do something
}condition為一個可得到布爾值的表達式,Go語言中并沒有while或者do-while語句,因此這種方式的用法接近其他編程語言的while或者do-while語句:
x := 1
for x < 20{
fmt.Println(x)
x++
}如果condition為空,那么此時for則為死循環(huán):
for {
//do something
}
for最經(jīng)典,在其他編程語言也有的用法是下面這種形式:
for init statement;condition;post statement{
//do something
}
用法示例:
for i := 0; i< 10 ;i++ {
fmt.Println(i)
}
另外,for語句還與關(guān)鍵字range配合,可以用于遍歷數(shù)組、map和切片等,其作用類似PHP中的foreach語句:
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關(guān)鍵字結(jié)束循環(huán)
for i := 0; i < 10; i++ {
if i == 5 {
break
}
fmt.Println(i)
}
使用continue結(jié)束跳過單次循環(huán):
for i := 0;i<10;i++{
if i == 5 {
continue
}
fmt.Println(i)
}
Switch
Switch與if類似,用于根據(jù)條件執(zhí)行滿足條件的代碼塊,但其用法與if不同,switch有幾種不同的用法:
第一種使用方法會將switch后面的值與case后面所跟的值進行比較,滿足條件則執(zhí)行case中的代碼塊,如果都不滿足,則執(zhí)行default中的代碼塊,其結(jié)構(gòu)如下所示:
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")
}
從上面的例子可以看出,在滿足某個條件后,switch執(zhí)行完該分支就會退出switch語句,不需要像其他編程語言一樣使用break來退出switch語句。
如果不想退出switch語句,需要繼續(xù)讓switch語句往下執(zhí)行,可以在case語句內(nèi)使用fallthrough關(guān)鍵詞:
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:之后,碰到了fallthrough語句,所以繼續(xù)往下執(zhí)行,接著繼續(xù)碰到fallthrough語句,再繼續(xù)執(zhí)行,因此三個case代碼塊都會被執(zhí)行。
switch的另一種用法是將后面的變量省略,而把執(zhí)行的判斷條件放在case關(guān)鍵詞后面,這個用法與if/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-switch是switch語句的另一種用法,主要用于類型斷言,后續(xù)在學習接口(interface)再介紹
小結(jié)
總結(jié)一下,這篇文章主要講了三點:
1.Go支持的運算符:
- 算術(shù)運算符
- 關(guān)系運算符
- 邏輯運算符
- 賦值運算符
- 位運算符
- 指針運算符
2.運算符的優(yōu)化級
3.Go支持的控制結(jié)構(gòu):
- If語句
- For語句
- Switch語句
到此這篇關(guān)于重學Go語言之運算符與控制結(jié)構(gòu)詳解的文章就介紹到這了,更多相關(guān)Go語言 運算符 控制結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mac下golang安裝了windows編譯環(huán)境后編譯變慢
這篇文章主要介紹了mac下golang安裝了windows編譯環(huán)境后編譯變慢的處理方法,非常的簡單,有相同問題的小伙伴可以參考下。2015-04-04
Golang構(gòu)建WebSocket服務(wù)器和客戶端的示例詳解
這篇文章主要為大家詳細介紹了如何使用Go語言構(gòu)建WebSocket服務(wù)器和客戶端,以實現(xiàn)雙向通信,文中的示例代碼講解詳細,需要的小伙伴可以參考一下2023-11-11
golang validator庫參數(shù)校驗實用技巧干貨
這篇文章主要為大家介紹了validator庫參數(shù)校驗實用技巧干貨,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04

