A avaliação do compilador vai diferir para expressão constante e outra expressão
Por que o código abaixo falha na compilação?
package main
import (
"fmt"
"unsafe"
)
var x int = 1
const (
ONE int = 1
MIN_INT int = ONE << (unsafe.Sizeof(x)*8 - 1)
)
func main() {
fmt.Println(MIN_INT)
}
Eu recebo um erro
main.go: 12: constant 2147483648 transborda int
A declaração acima está correta. Sim, 2147483648 transborda int (na arquitetura de 32 bits). Mas a operação de mudança deve resultar em um valor negativo, ou seja, -2147483648.
Mas o mesmo código funciona, se eu alterar as constantes em variáveis e obter a saída esperada.
package main
import (
"fmt"
"unsafe"
)
var x int = 1
var (
ONE int = 1
MIN_INT int = ONE << (unsafe.Sizeof(x)*8 - 1)
)
func main() {
fmt.Println(MIN_INT)
}