我發現以下特點:用於比較字符和符文的Go的規則是什麼?
b := "a"[0]
r := 'a'
fmt.Println(b == r) // Does not compile, cannot compare byte and rune
fmt.Println("a"[0] == 'a') // Compiles and prints "true"
這是如何工作的?
我發現以下特點:用於比較字符和符文的Go的規則是什麼?
b := "a"[0]
r := 'a'
fmt.Println(b == r) // Does not compile, cannot compare byte and rune
fmt.Println("a"[0] == 'a') // Compiles and prints "true"
這是如何工作的?
這是untyped constants一個例子。從文檔:
分別使用布爾,數字或字符串類型的操作數的任何類型的布爾值,數值和字符串常量都可以用作操作數。除了移位操作外,如果二元操作的操作數是不同類型的非類型常量,則操作和非布爾操作的結果將使用此列表中稍後出現的類型:整數,符文,浮點,複數。
由於'a'
是一個無類型常量,因此編譯器會嘗試將它轉換爲與其他操作數相當的類型。在這種情況下,它被轉換爲byte
。
你可以看到,當符文常數不適合單個字節這不工作:
package main
import (
"fmt"
)
func main() {
const a = '€'
fmt.Println("a"[0] == a) // constant 8364 overflows byte
}
符文字面'a'代表一個符文常數。常數可能是無類型的。簡稱申報表r := 'a'
符文常數'a'
隱含轉換爲其默認類型rune
。但是你可以通過賦值給類型變量來明確地轉換它。
var r byte = 'a'