The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
bin381

问一个 Go 类型转换问题

  •  
  •   bin381 · Sep 29, 2017 · 2512 views
    This topic created in 3166 days ago, the information mentioned may be changed or developed.

    var x uint64 = 257

    var y int = 257

    fmt.Println("rv is ", rv)

    fmt.Println("rv2 is ", byte(x))

    fmt.Println("rv3 is ", byte(y))

    fmt.Println("rv3 is ", byte(int(257))) # constant 257 overflows byte 这里报错了

    Supplement 1  ·  Sep 29, 2017
    var y int = 257
    fmt.Println("rv3 is ", byte(y)) # 这里是没有问题的
    fmt.Println("rv3 is ", byte(int(257))) # 这里报错了

    =================

    var x uint64 = 257
    fmt.Println("rv2 is ", byte(x)) #这是没有问题的

    按道理都是 int 转 byte,应该都报错才对呢
    7 replies    2017-10-10 18:54:46 +08:00
    zdt3476
        1
    zdt3476  
       Sep 29, 2017
    所以,想问啥?
    mason961125
        2
    mason961125  
       Sep 29, 2017
    你把 int 转换成 byte 肯定溢出阿...int 占用空间比 byte 大多了
    C0reFast
        3
    C0reFast  
       Sep 29, 2017
    这个应该是编译期检查,257 是超出 byte 类型表达能力的,直接用 byte(257)和 var z byte = 257 是一样的。其他两个都是运行时了。
    bin381
        4
    bin381  
    OP
       Sep 29, 2017
    fmt.Println("rv3 is ", byte(y)) 这里是没有报错的
    fmt.Println("rv3 is ", byte(int(257))) 这个是报错了
    bin381
        5
    bin381  
    OP
       Sep 29, 2017
    @zdt3476
    @mason961125

    我补充了说明
    6ufq0VLZn0DDkL80
        6
    6ufq0VLZn0DDkL80  
       Sep 29, 2017   ❤️ 1
    Go 对常量和非常量的类型转换规则是不一样的。

    https://golang.org/ref/spec#Conversions

    常量转换会判定这个值能否用目标类型表示,非常量只会判类型是否符合转换条件。
    iceheart
        7
    iceheart  
       Oct 10, 2017 via Android
    257 是立即数,byte 装不下,编译器不知道咋处理,当然报错啦。
    用变量转 byte,溢出了是另一回事,编译器不关心这个,所以编译过啦
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2640 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 10:29 · PVG 18:29 · LAX 03:29 · JFK 06:29
    ♥ Do have faith in what you're doing.