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 main
import "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)
}
24、對map使用「for range」語句迭代0x41 0xfffd 0x2 0xfffd 0x4
0x41 0xfe 0x2 0xff 0x4
如果你希望以某個順序(比如,按key值排序)的方式得到元素,就需要這個技巧。每次的map迭代將會生成不同的結果。go的runtime有心嘗試隨機化迭代順序,但並不總會成功,這樣你可能得到一些相同的map迭代結果。所以如果連續看到5個相同的迭代結果,不要驚訝。
而且如果你使用go的遊樂場(你將總會得到同樣的結果,因為除非你修改**,否則它不會重新編譯**。package main
import "fmt"
func main()
for k, v := range m
}
25、"switch"宣告中的失效行為
在「switch」宣告語句中的「case」語句塊在預設情況下會break。這和其他語言中的進入下乙個「next」**塊的預設行為不同。
執行結果:package main
import "fmt"
func main()
return false
}
fmt.println(isspace('\t'))
fmt.println(isspace(' '))
}
你可以通過在每個「case」塊的結尾使用「fallthrough」,來強制「case」**塊進入。你也可以重寫switch語句,來使用「case」塊中的表示式列表。true
false
package main
import "fmt"
func main()
return false
}
fmt.println(isspace('\t'))
fmt.println(isspace(' '))
}
執行結果:package main
import "fmt"
func main()
return false
}
fmt.println(isspace('\t'))
fmt.println(isspace(' '))
}
26、自增和自減true
true
許多語言都有自增和自減操作。不像其他語言,go不支援前置版本的操作。你也無法在表示式中使用這兩個操作符。
錯誤**:
編譯錯誤:package main
import (
"fmt"
)
func main()
i := 0
++i
fmt.println(data[i++])
}
./main.go:10:2: syntax error: unexpected ++, expecting }
正確**:
27、按位not操作package main
import "fmt"
func main()
i := 0
i++
fmt.println(data[i])
}
許多語言使用 ~作為一元的not操作符(即按位補足),但go為了這個重用了xor操作符(^)。
錯誤**:
編譯錯誤:package main
import "fmt"
func main()
./main.go:6:14: bitwise complement operator is ^
正確**:
go依舊使用^作為xor的操作符,這可能會讓一些人迷惑。package main
import "fmt"
func main()
如果你願意,你可以使用乙個二元的xor操作(如, 0x02 xor 0xff)來表示乙個一元的not操作(如,not 0x02)。這可以解釋為什麼^被重用來表示一元的not操作。
go也有特殊的『and not』按位操作(&^),這也讓not操作更加的讓人迷惑。這看起來需要特殊的特性/hack來支援 a and (not b),而無需括號。
28、操作優先順序的差異package main
import "fmt"
func main()
除了」bit clear「操作(&^),go也乙個與許多其他語言共享的標準操作符的集合。儘管操作優先順序並不總是一樣。
執行結果:package main
import "fmt"
func main()
0x2 & 0x2 + 0x4 -> 0x6
0x2 + 0x2 << 0x1 -> 0x6
0xf | 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...