Go用于比较字节和符文的规则是什么?

时间:2016-05-04 23:15:56

标签: go byte rune

我发现了以下特点:

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"

这是如何运作的?

2 个答案:

答案 0 :(得分:5)

这是untyped constants的一个例子。来自文档:

  

无符号布尔值,数字和字符串常量可以用作操作数,分别使用布尔值,数字或字符串类型的操作数是合法的。除了移位操作之外,如果二元操作的操作数是不同类型的无类型常量,则操作和对于非布尔操作,结果使用此列表中稍后出现的类型:整数,符文,浮点数,复数

由于'a'是一个无类型常量,编译器会尝试将其转换为与另一个操作数相当的类型。在这种情况下,它会转换为byte

当符文常量不适合单个字节时,您可以看到这不起作用:

package main

import (
    "fmt"
)

func main() {
    const a = '€'
    fmt.Println("a"[0] == a) // constant 8364 overflows byte
}

https://play.golang.org/p/lDN-SERUgN

答案 1 :(得分:0)

符文字面'a'代表符文常量。常量可以是无类型的。简而言之,声明格式r := 'a'符文常量'a'将以其默认类型rune隐式转换。但您可以通过分配类型变量来显式转换它。

var r byte = 'a'

看到它有用https://play.golang.org/p/lqMq8kQoE-