今天小編給大家分享一下Go語言開發(fā)中常見的陷阱有哪些的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
創(chuàng)新互聯(lián)為您提適合企業(yè)的網(wǎng)站設(shè)計(jì)?讓您的網(wǎng)站在搜索引擎具有高度排名,讓您的網(wǎng)站具備超強(qiáng)的網(wǎng)絡(luò)競(jìng)爭(zhēng)力!結(jié)合企業(yè)自身,進(jìn)行網(wǎng)站設(shè)計(jì)及把握,最后結(jié)合企業(yè)文化和具體宗旨等,才能創(chuàng)作出一份性化解決方案。從網(wǎng)站策劃到網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站, 我們的網(wǎng)頁設(shè)計(jì)師為您提供的解決方案。
Go作為一種簡(jiǎn)便靈巧的語言,深受開發(fā)者的喜愛。但對(duì)于初學(xué)者來說,要想輕松駕馭它,還得做好細(xì)節(jié)學(xué)習(xí)工作。
初學(xué)者應(yīng)該注意的地方:
大括號(hào)不能獨(dú)立成行。
未使用變量錯(cuò)誤——對(duì)于全局變量和函數(shù)參數(shù)變量,是可以定義后不使用的。但是對(duì)于函數(shù)內(nèi)部變量來說,如果進(jìn)行定義后不進(jìn)行使用,編譯器會(huì)提示錯(cuò)誤。
導(dǎo)入包未調(diào)用錯(cuò)誤——導(dǎo)入包后,如果不進(jìn)行調(diào)用,例如函數(shù),接口,結(jié)構(gòu)及變量等對(duì)象,那么會(huì)出現(xiàn)編譯錯(cuò)誤。這里建議使用空白表示符“_”來避免類似錯(cuò)誤。
變量簡(jiǎn)寫只適用于函數(shù)內(nèi)部。
重新定義變量要使用簡(jiǎn)寫聲明——你不能在一個(gè)獨(dú)立的語句中重新定義一個(gè)變量,但在復(fù)合變量場(chǎng)合是允許的。重新定義的變量需存在于同一區(qū)塊,否則會(huì)產(chǎn)生一個(gè)陰影變量。
意外的變量——變量簡(jiǎn)寫語法由于十分簡(jiǎn)便,因此很容易會(huì)把它作為一個(gè)常規(guī)的指派操作。雖然可以通過編譯,但是其結(jié)果卻不是我們想要的。
不能使用“nil”來定義一個(gè)沒有類型的變量——“nil”關(guān)鍵字可用于表示“0值”,例如在接口,函數(shù),指針等對(duì)象中。但如果把它用于定義一個(gè)沒有進(jìn)行類型聲明的變量,將會(huì)導(dǎo)致編譯錯(cuò)誤,因?yàn)榫幾g器無法確定變量類型。
使用“nil”切片(Slices)和圖(Maps)——為“nil”切片添加對(duì)象是可以的,但對(duì)于圖來說,這樣會(huì)造成運(yùn)行緩慢。
圖容量——可以在創(chuàng)建時(shí)設(shè)定圖的容量,但是不用對(duì)圖使用cap()。
字符串不能為“nil”。
數(shù)組函數(shù)參數(shù)——對(duì)于C/C++開發(fā)者來說,數(shù)組如同指針;當(dāng)把數(shù)組傳入函數(shù)時(shí),函數(shù)會(huì)引用相同的內(nèi)存位置,所以能夠更新原始數(shù)據(jù)。但在Go中,數(shù)組是值,因此當(dāng)把數(shù)組傳入函數(shù)時(shí),得到的是原始數(shù)組數(shù)據(jù)的副本。因此如果想更新數(shù)組數(shù)據(jù),這個(gè)造成問題。
切片和數(shù)組“范圍(range)”里的異常——在使用for-in或foreach語句時(shí)會(huì)遇到該問題。在Go中,range的定義是有所不同的。它會(huì)產(chǎn)生兩個(gè)值:第一個(gè)為索引項(xiàng),第二個(gè)說項(xiàng)的數(shù)據(jù)。
單維度的切片和數(shù)——要?jiǎng)?chuàng)建一個(gè)動(dòng)態(tài)多維度數(shù)組,要使用獨(dú)立切片。首先,要?jiǎng)?chuàng)建外層切片;然后,要對(duì)每個(gè)內(nèi)聯(lián)切片進(jìn)行分配。每個(gè)內(nèi)聯(lián)切片對(duì)于其它切片來說是獨(dú)立的。
訪問不存在的圖鍵——如果想知道一個(gè)給定圖記錄是否存在,應(yīng)該通過檢查來自圖訪問操作的第二個(gè)值。
不可改變的字符串——如果想通過索引運(yùn)算符來更新一個(gè)字符串變量中的獨(dú)立字符是會(huì)出現(xiàn)錯(cuò)誤的,由于字符串是只讀的字節(jié)片。正確做法是使用一個(gè)單字節(jié)片進(jìn)行操作而不是轉(zhuǎn)成字符串類型進(jìn)行操作。
字符串和字節(jié)片轉(zhuǎn)換——當(dāng)把字符串轉(zhuǎn)換為字節(jié)片時(shí),你得到是一份完整的原始數(shù)據(jù)。Go提供了一對(duì)[]byte to string,string to []byte的優(yōu)化轉(zhuǎn)換操作,以防止造成額外分配。
字符串和索引運(yùn)算符——字符串中的索引運(yùn)算符返回的是字節(jié)值而不是字符。
字符串不總是UTF8文本——字符串沒有被限定為UTF8文本。它們可以包含任何字節(jié)。只有當(dāng)使用字符串常數(shù)時(shí)才是UTF8文本。
字符串長(zhǎng)度——Go中應(yīng)使用RuneCountInString()函數(shù)來取得字符串長(zhǎng)度值而不是len()函數(shù)。
多行切片,數(shù)組,和圖定義中缺少逗號(hào)。
log.Fatal和log.Panic:日志庫提供了不同的日志級(jí)別。
預(yù)置數(shù)據(jù)結(jié)構(gòu)運(yùn)算是不同步的。
在range中的字符串迭代值。
使用for range來進(jìn)行圖迭代。
Switch語句的注意事項(xiàng):switch語句的case區(qū)塊默認(rèn)是隔斷的。
遞增和遞減:Go中是不支持i++或++i的遞增/減操作的。
按位不是運(yùn)算符:很多語言使用~來作為一元邏輯非運(yùn)算符,而Go中則使用^。
運(yùn)算符優(yōu)先級(jí)差異。
導(dǎo)出結(jié)構(gòu)域是沒有編碼。
程序結(jié)束時(shí)沒有銷毀Go線程。
當(dāng)目標(biāo)接收器就緒時(shí)就發(fā)送一個(gè)緩沖區(qū)通道返回。
封閉通道發(fā)送的問題。
使用“nil”通道。
有值接收器的方法不能用于改變?cè)贾怠?/p>
中級(jí)開發(fā)者應(yīng)該注意的地方:
關(guān)閉HTTP響應(yīng)。
關(guān)閉HTTP連接。
結(jié)構(gòu),數(shù)組,切片和圖的比較。
可以使用==運(yùn)算符來比較不同的結(jié)構(gòu)變量。
從異常中恢復(fù)。
可以使用recover()來捕獲/攔截異常。
更新和引用切片,數(shù)組,及圖“range”的項(xiàng)值。
切片的“隱藏”數(shù)據(jù)。
切片數(shù)據(jù)的錯(cuò)誤。
“變味”的切片。
類型聲明和方法。
for switch和for select代碼塊的終止。
for語句中的迭代變量和結(jié)束。
延遲的函數(shù)調(diào)用參數(shù)求值。
延遲函數(shù)調(diào)用執(zhí)行。
錯(cuò)誤類型的判斷。
斷開的Go線程和資源泄漏。
高級(jí)開發(fā)者應(yīng)該注意的地方:
對(duì)值實(shí)例使用指針接收方法。
更新圖值域。
“nil”接口和“nil”接口值。
堆棧變量。
GOMAXPROCS,并發(fā),并行化。
搶先調(diào)度。
以“大括號(hào)不能獨(dú)立成行”為例:
錯(cuò)誤寫法:
[js] view plaincopy
package main
import "fmt"
func main()
{ //error, can't have the opening brace on a separate line
fmt.Println("hello there!")
}
編譯錯(cuò)誤提示:
/tmp/sandbox826898458/main.go:6: syntax error: unexpected semicolon or newline before {
正確寫法:
[js] view plaincopy
package main
import "fmt"
func main() {
fmt.Println("works!")
}
以上就是“Go語言開發(fā)中常見的陷阱有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。