我发现了以下特点:
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"
这是如何运作的?
这是一个无类型常量的例子。从文档:
只要可以分别使用布尔、数字或字符串类型的操作数,无类型的布尔、数字和字符串常量都可以用作操作数。除了移位操作,如果二元操作的操作数是不同类型的无类型常量,则操作和非布尔操作的结果使用此列表后面出现的类型:整数、符文、浮点数、复数.
由于'a'
是一个无类型常量,编译器会尝试将其转换为与其他操作数相当的类型。在这种情况下,它会转换为byte
.
当符文常量不适合单个字节时,您可以看到这不起作用:
package main
import (
"fmt"
)
func main() {
const a = '€'
fmt.Println("a"[0] == a) // constant 8364 overflows byte
}
符文文字“a”代表符文常数。常量可能是无类型的。简而言之, r := 'a'
rune 常量'a'
的声明形式隐式转换为其默认类型,即rune
. 但是您可以通过分配给类型化变量来显式转换它。
var r byte = 'a'