【问题标题】:What are Go's rules for comparing bytes with runes?Go 将字节与符文进行比较的规则是什么?
【发布时间】:2016-08-30 14:19:26
【问题描述】:

我发现了以下特点:

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 byte rune


    【解决方案1】:

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

    var r byte = 'a'
    

    看看它的工作原理https://play.golang.org/p/lqMq8kQoE-

    【讨论】:

      【解决方案2】:

      这是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

      【讨论】:

        猜你喜欢
        • 2013-05-21
        • 2019-02-27
        • 1970-01-01
        • 2016-12-22
        • 1970-01-01
        • 2015-09-22
        • 1970-01-01
        • 2014-10-10
        • 1970-01-01
        相关资源
        最近更新 更多