我在Go程序的输出中遇到了一个差异,特别是变量x1和x2.以下是相关的代码片段:

package main

var n uint = 10
const N uint = 10

func main() {
    var x1 byte = (1 << n) / 100
    var x2 byte = (1 << N) / 100
    println(x1, x2)
}

预期输出: 10 10

实际yields : 0 10

对差异背后的原因感到好奇,寻求解释.

推荐答案

常量表达式的计算精度未指定.赋值到x2中的所有内容都是常量,因此它可以正确地计算210/the spec=byte4/the spec=10.而在第一个表达式中,1被视为byte,这意味着它会立即移出.1必须被视为byte的比例为the spec:

如果非常数移位表达式的左操作数是无类型常量,则首先将其隐式转换为仅用其左操作数替换移位表达式时所采用的类型.

1是左边的非类型化常量,nvar使得表达式不是常量,因此1必须具有其被赋值对象x1的类型,即byte.

Go相关问答推荐

从Kafka到Clickhouse的实时消费数据

如何在围棋中从多部分.Part中获取多部分.文件而不保存到磁盘?

Docker Compose Health Check未退出,错误为无法启动

Golang在不写入磁盘的情况下为jpeg图像生成一致的哈希

Azure golang SDK - 将 AcrPull 角色分配给 AKS 群集

我怎样才能改进这个嵌套逻辑以使其正常工作并提高性能

Go 中带有回调的 MiniDumpWriteDump

在密钥不存在时处理 PATCH 部分更新

Go 的垃圾收集器在使用时删除 ZeroMQ 套接字

AddE 上的 Apache Tinkerpop gremlin-go 驱动程序 Next() 返回E0903:没有剩余结果

SSH 代理,数据包长度错误

emersion/go-imap - imap.FetchRFC822:无效内存地址或零指针取消引用

在 Golang 中,如何将接口作为泛型类型与 nil 进行比较?

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

Golang prometheus 显示自定义指标

如何在gorm中处理多个查询

在 Go 中将十六进制转换为带符号的 Int

如何在眼镜蛇(golang)中将标志作为参数传递?

(如何)我可以基于接口抽象地实现Stringer吗?

Go generics:我会在哪里使用 any 而不是 interface{}?