Go語言錯誤總結(四)

2021-09-23 22:29:30 字數 3962 閱讀 5659

22、內建的資料結構操作不是同步的

即使go本身有很多特性來支援併發,併發安全的資料集合並不是其中之一,確保資料集合以原子的方式更新是你的職責。goroutines和channels是實現這些原子操作的推薦方式,但你也可以使用「sync」包,如果它對你的應用有意義的話。

23、string在「range」語句中的迭代值

索引值(「range」操作返回的第乙個值)是返回的第二個值的當前「字元」(unicode編碼的point/rune)的第乙個byte的索引。它不是當前「字元」的索引,這與其他語言不同。注意真實的字元可能會由多個rune表示。如果你需要處理字元,確保你使用了「norm」包(golang.org/x/text/unicode/norm)。

string變數的for range語句將會嘗試把資料翻譯為utf8文字。對於它無法理解的任何byte序列,它將返回0xfffd runes(即unicode替換字元),而不是真實的資料。如果你任意(非utf8文字)的資料儲存在string變數中,確保把它們轉換為byte slice,以得到所有儲存的資料。

package mainimport "fmt"func main()//prints: 0x41 0xfffd 0x2 0xfffd 0x4 (not ok)fmt.println()for _, v := range byte(data)//prints: 0x41 0xfe 0x2 0xff 0x4 (good)}
執行結果:​​​​​​​

0x41 0xfffd 0x2 0xfffd 0x40x41 0xfe 0x2 0xff 0x4
24、對map使用「for range」語句迭代

如果你希望以某個順序(比如,按key值排序)的方式得到元素,就需要這個技巧。每次的map迭代將會生成不同的結果。go的runtime有心嘗試隨機化迭代順序,但並不總會成功,這樣你可能得到一些相同的map迭代結果。所以如果連續看到5個相同的迭代結果,不要驚訝。

package mainimport "fmt"func main()for k, v := range m}
而且如果你使用go的遊樂場(你將總會得到同樣的結果,因為除非你修改**,否則它不會重新編譯**。

25、"switch"宣告中的失效行為

在「switch」宣告語句中的「case」語句塊在預設情況下會break。這和其他語言中的進入下乙個「next」**塊的預設行為不同。​​​​​​​

package mainimport "fmt"func main()return false}fmt.println(isspace('\t'))fmt.println(isspace(' '))}
執行結果:​​​​​​​

truefalse
你可以通過在每個「case」塊的結尾使用「fallthrough」,來強制「case」**塊進入。你也可以重寫switch語句,來使用「case」塊中的表示式列表。​​​​​​​

package mainimport "fmt"func main()return false}fmt.println(isspace('\t'))fmt.println(isspace(' '))}​​​​​​​
package mainimport "fmt"func main()return false}fmt.println(isspace('\t'))fmt.println(isspace(' '))}
執行結果:​​​​​​​

truetrue
26、自增和自減

許多語言都有自增和自減操作。不像其他語言,go不支援前置版本的操作。你也無法在表示式中使用這兩個操作符。

錯誤**:​​​​​​​

package mainimport ("fmt")func main()i := 0++ifmt.println(data[i++])}
編譯錯誤:

./main.go:10:2: syntax error: unexpected ++, expecting }
正確**:​​​​​​

package mainimport "fmt"func main()i := 0i++fmt.println(data[i])}
27、按位not操作

許多語言使用 ~作為一元的not操作符(即按位補足),但go為了這個重用了xor操作符(^)。

錯誤**:​​​​​​​

package mainimport "fmt"func main()
編譯錯誤:

./main.go:6:14: bitwise complement operator is ^
正確**:​​​​​​​

package mainimport "fmt"func main()
go依舊使用^作為xor的操作符,這可能會讓一些人迷惑。

如果你願意,你可以使用乙個二元的xor操作(如, 0x02 xor 0xff)來表示乙個一元的not操作(如,not 0x02)。這可以解釋為什麼^被重用來表示一元的not操作。

go也有特殊的『and not』按位操作(&^),這也讓not操作更加的讓人迷惑。這看起來需要特殊的特性/hack來支援 a and (not b),而無需括號。​​​​​​​

package mainimport "fmt"func main()
28、操作優先順序的差異

除了」bit clear「操作(&^),go也乙個與許多其他語言共享的標準操作符的集合。儘管操作優先順序並不總是一樣。​​​​​​​

package mainimport "fmt"func main()
執行結果:​​​​​​​

0x2 & 0x2 + 0x4 -> 0x60x2 + 0x2 << 0x1 -> 0x60xf | 0x2 ^ 0x2 -> 0xd

go錯誤總結

1 go get v 出現問題 例如 can t load package package no go files in c users nick 無法載入包 package 無可構建go原始檔 解決辦法 1 我必須指定乙個更具體的子包來安裝。錯誤 go get github.com garybur...

go語言錯誤型別

1.考慮的error的使用原因 error型別本身就是乙個預定義好的介面,裡面定義了乙個method type error inte ce 2如何完成error的第乙個簡單的呼叫,輸出的格式err fmt.errorf s error this is error func main fmt.prin...

go語言初探 四

運算子不細講,和c 差不多,注意優先順序就行了,不過我喜歡加括號。控制語句 在switch case 語句中 可以不用寫break,別問,問就是自帶。還多了fallthrough 可以強行執行後面的case語句。即 從第乙個判斷表示式為 true 的 case 開始執行,如果 case 帶有 fal...