我发现以下特点:用于比较字符和符文的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'