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

