最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

重學(xué)Go語(yǔ)言之運(yùn)算符與控制結(jié)構(gòu)詳解

 更新時(shí)間:2023年02月28日 14:45:51   作者:程序員讀書(shū)  
對(duì)于任何編程語(yǔ)言來(lái)說(shuō),運(yùn)算符和控制結(jié)構(gòu)都算是最基礎(chǔ)的知識(shí)了,既然是基礎(chǔ),當(dāng)然非常有必要學(xué)習(xí),因此在這篇文章中我們就來(lái)討論一下

運(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-switchswitch語(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)文章

  • Go中recover與panic區(qū)別詳解

    Go中recover與panic區(qū)別詳解

    這篇文章主要介紹了Go中recover與panic區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • mac下golang安裝了windows編譯環(huán)境后編譯變慢

    mac下golang安裝了windows編譯環(huán)境后編譯變慢

    這篇文章主要介紹了mac下golang安裝了windows編譯環(huán)境后編譯變慢的處理方法,非常的簡(jiǎn)單,有相同問(wèn)題的小伙伴可以參考下。
    2015-04-04
  • Golang Mutex實(shí)現(xiàn)互斥的具體方法

    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ǔ)言實(shí)現(xiàn)分布式鎖

    Go語(yǔ)言實(shí)現(xiàn)分布式鎖

    分布式鎖是控制分布式系統(tǒng)之間同步訪(fǎng)問(wèn)共享資源的一種方式。如果不同的系統(tǒng)或是同一個(gè)系統(tǒng)的不同主機(jī)之間共享了一個(gè)或一組資源,那么訪(fǎng)問(wèn)這些資源時(shí),需要通過(guò)一些互斥手段來(lái)防止彼此之間的干擾以保證一致性,在這種情況下,就需要使用分布式鎖了
    2023-01-01
  • Go語(yǔ)言sync.Map詳解及使用場(chǎng)景

    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ù)端的示例詳解

    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)證碼示例實(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ù))的示例

    本文主要介紹了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ì)

    這篇文章主要帶大家細(xì)細(xì)探究了Go 泛型generic設(shè)計(jì)及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • golang validator庫(kù)參數(shù)校驗(yàn)實(shí)用技巧干貨

    golang validator庫(kù)參數(shù)校驗(yàn)實(shí)用技巧干貨

    這篇文章主要為大家介紹了validator庫(kù)參數(shù)校驗(yàn)實(shí)用技巧干貨,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04

最新評(píng)論

垦利县| 安仁县| 上栗县| 苍南县| 巴东县| 错那县| 聂拉木县| 民权县| 沙坪坝区| 阳朔县| 汨罗市| 株洲县| 大关县| 京山县| 石景山区| 甘南县| 平利县| 云霄县| 普格县| 许昌市| 专栏| 财经| 长汀县| 罗山县| 宜都市| 佛冈县| 金乡县| 莎车县| 碌曲县| 水富县| 宣汉县| 遵义县| 邓州市| 禄丰县| 谷城县| 钦州市| 崇州市| 射洪县| 沾益县| 青河县| 裕民县|