重學(xué)Go語言之運(yùn)算符與控制結(jié)構(gòu)詳解
運(yùn)算符
運(yùn)算符的作用是將操作數(shù)組合成表達(dá)式,比如下面的代碼中,我們通過賦值和加號組成了兩個(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)算符 | 含義 |
---|---|
+ | 加號,除了用于整數(shù),浮點(diǎn)數(shù),復(fù)數(shù)外,還可以用于字符串的拼接 |
- | 減號 |
* | 相乘 |
/ | 相除 |
% | 求余,只能用于整數(shù) |
++ | 自增 |
-- | 自減 |
+ | 正數(shù),注意與加號(+)的區(qū)別 |
- | 負(fù)數(shù),注意與減號(-)的區(qū)別 |
用法示例:
var str1 string = "hello" var str2 string = "world" str := str1 + str2 //使用+號拼接字符串 i := 3.2 % 2 //報(bào)錯(cuò),只能對整數(shù)求余 var n int = 1 n++ ++n //錯(cuò)誤,自增只能加了操作數(shù)后面,自減也是同樣的
關(guān)系運(yùn)算符
通過邏輯運(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)先級 |
位運(yùn)算符
位運(yùn)算符只能用于整數(shù)
運(yùn)算符 | 含義 |
---|---|
& | 按位與,兩個(gè)操作數(shù)都1的位置為1,否為0 |
| | 按位或,兩個(gè)操作數(shù)只要有1的位置,都為1,否則為0 |
按位異或,兩個(gè)操作數(shù)都相同為0,否則為1 | |
<< | 按位左移 |
>> | 按位右移 |
&^ | 按位清空,根據(jù)右邊操作數(shù)為1的位置,將左邊對應(yīng)位置設(shè)為0。 |
用法示例:
fmt.Println(2 & 1) // 00000010 & 00000001,可以看出,沒有哪個(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)先級
Go的++與--運(yùn)算符作用于操作數(shù)時(shí)形成的是表達(dá)式,因此不納入運(yùn)算符的優(yōu)先級中。
在Go語言中,一元運(yùn)算符具有更高的優(yōu)先級,如+(正數(shù)), -(負(fù)數(shù)),!(取反),*(指針聲明), &(取址)。
而賦值運(yùn)算符的優(yōu)先級最低,除了一元運(yùn)算符以及賦值運(yùn)算符外,剩下的運(yùn)算符可以劃分為五個(gè)優(yōu)先等級:
優(yōu)先級 | 運(yùn)算符 |
---|---|
5 | * / % << >> & &^ |
4 | + - | ^ |
3 | == != < <= >= > |
2 | && |
1 | || |
控制結(jié)構(gòu)
Go的控制結(jié)構(gòu)包括if
語句、for
語句和switch
語句三種。
If
if
語句用于判斷某個(gè)條件是否滿足,如果滿足,則執(zhí)行if語句中的代碼塊,如果不滿足,則忽略if
語句中的代碼塊并繼續(xù)向后執(zhí)行。
最簡單的if
語句結(jié)構(gòu)為:
if boolean expression { // do something }
其中boolean expression
為一個(gè)可以得到布爾值的表達(dá)式,當(dāng)布爾值為true
,會(huì)執(zhí)行if
語句中的代碼塊,如:
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
語句后面也可以跟上else
語句,當(dāng)然if
條件不滿足時(shí),會(huì)執(zhí)行else
語句中的代碼塊:
if boolean expression{ // do something }else{ // do something }
用法示例:
if i = 11;i < 11{ fmt.Println("ok") }else{ fmt.Println("bad") }
如果有多個(gè)分支條件判斷,可以在if
語句后面跟上多個(gè)else if 語句,最后可以跟上else
語句,當(dāng)所有條件都不滿足時(shí),會(huì)執(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
為一個(gè)可得到布爾值的表達(dá)式,Go
語言中并沒有while
或者do-while
語句,因此這種方式的用法接近其他編程語言的while
或者do-while
語句:
x := 1 for x < 20{ fmt.Println(x) x++ }
如果condition
為空,那么此時(shí)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
有幾種不同的用法:
第一種使用方法會(huì)將switch后面的值與case后面所跟的值進(jìn)行比較,滿足條件則執(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") }
從上面的例子可以看出,在滿足某個(gè)條件后,switch執(zhí)行完該分支就會(huì)退出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í)行,因此三個(gè)case代碼塊都會(huì)被執(zhí)行。
switch
的另一種用法是將后面的變量省略,而把執(zhí)行的判斷條件放在case
關(guān)鍵詞后面,這個(gè)用法與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
后面可以跟上一個(gè)初始化語句:
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ù)在學(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)化級
3.Go支持的控制結(jié)構(gòu):
- If語句
- For語句
- Switch語句
到此這篇關(guān)于重學(xué)Go語言之運(yùn)算符與控制結(jié)構(gòu)詳解的文章就介紹到這了,更多相關(guān)Go語言 運(yùn)算符 控制結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何在Go中實(shí)現(xiàn)優(yōu)雅停止
和其他語言相比,Go 中有相同也有不同,相同的是實(shí)現(xiàn)思路上和其他語言沒啥差異,不同在于 Go 采用的是 goroutine + channel 的并發(fā)模型,與傳統(tǒng)的進(jìn)程線程相比,實(shí)現(xiàn)細(xì)節(jié)上存在差異,本文將從實(shí)際場景和它的一般實(shí)現(xiàn)方式展開,逐步討論這個(gè)話題,需要的朋友可以參考下2024-04-04詳解Go語言如何實(shí)現(xiàn)并發(fā)安全的map
go語言提供的數(shù)據(jù)類型中,只有channel是并發(fā)安全的,基礎(chǔ)map并不是并發(fā)安全的,本文為大家整理了三種實(shí)現(xiàn)了并發(fā)安全的map的方案,有需要的可以參考下2023-12-12golang?中?channel?的詳細(xì)使用、使用注意事項(xiàng)及死鎖問題解析
這篇文章主要介紹了golang?中?channel?的詳細(xì)使用、使用注意事項(xiàng)及死鎖分析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03go自動(dòng)下載所有的依賴包go module使用詳解
這篇文章主要介紹了go自動(dòng)下載所有的依賴包go module使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03golang?run時(shí)報(bào)undefined錯(cuò)誤的解決
這篇文章主要介紹了golang?run時(shí)報(bào)undefined錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03