为什么%T不打印我常量的类型?

sco*_*awg 3 types constants go

我正在学习使用官方旅游/教程的golang.在其中一个例子中,我看到一个说明An untyped constant takes the type needed by its context.

我正在尝试这个:

package main

import "fmt"

const (
    // Create a huge number by shifting a 1 bit left 100 places.
    // In other words, the binary number that is 1 followed by 100 zeroes.
    Big = 1 << 100
)

func main() {
    fmt.Printf("Big is of type %T\n", Big)
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时失败了:

# command-line-arguments
./compile63.go:12:13: constant 1267650600228229401496703205376 overflows int
Run Code Online (Sandbox Code Playgroud)

为什么我无法通过这种方式发现常数的类型?(请注意我是一个完全的菜鸟,很可能还没有发现足够的语言能够自己解决这个问题).

pet*_*rSO 5

func Printf

func Printf(format string, a ...interface{}) (n int, err error)
Run Code Online (Sandbox Code Playgroud)

Printf根据格式说明符格式化并写入标准输出.它返回写入的字节数和遇到的任何写入错误.


Go编程语言规范


变量声明

变量声明创建一个或多个变量,将相应的标识符绑定到它们,并为每个变量赋予类型和初始值.

如果给出了表达式列表,则使用遵循赋值规则的表达式初始化变量.否则,每个变量都初始化为零值.

如果存在类型,则为每个变量赋予该类型.否则,为每个变量赋予赋值中相应初始化值的类型.如果该值是无类型常量,则首先将其转换为其默认类型; 如果它是无类型的布尔值,则首先将其转换为bool类型.预先声明的值nil不能用于初始化没有显式类型的变量.


常量

常量可以是打字的或无类型的.仅包含无类型常量操作数的文字常量,true,false,iota和某些常量表达式是无类型的.

常量可以通过常量声明或转换显式给定,或者在变量声明或赋值中使用时隐式赋值,或者作为表达式中的操作数使用.如果常量值不能表示为相应类型的值,则会出错.

无类型常量具有默认类型,该类型是在需要类型化值的上下文中隐式转换常量的类型,例如,在短变量声明中,例如i:= 0,其中没有显式类型.无类型常量的默认类型分别是bool,rune,int,float64,complex128或string,具体取决于它是布尔值,符文,整数,浮点数,复数还是字符串常量.


数字类型

数字类型表示整数或浮点值的集合.一些预先声明的与体系结构无关的数字类型:

int32       the set of all signed 32-bit integers (-2147483648 to 2147483647)
int64       the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)
Run Code Online (Sandbox Code Playgroud)

n位整数的值是n位宽,并使用二进制补码算法表示.

还有一些具有特定于实现的大小的预先声明的数字类型:

uint     either 32 or 64 bits
int      same size as uint
Run Code Online (Sandbox Code Playgroud)

Big是一个无类型的常数.没有类型可以发现.在变量或赋值中使用时,它会被赋予类型.无类型常量的默认类型Bigint.

const Big = 1 << 100
Run Code Online (Sandbox Code Playgroud)

在Go中,所有参数都按值传递,就像通过赋值一样.因为fmt.Printf,第二个参数是类型interface{}.因此,等效地,

var arg2 interface{} = Big  // constant 1267650600228229401496703205376 overflows int
fmt.Printf("Big is of type %T\n", arg2)
Run Code Online (Sandbox Code Playgroud)

无类型整数常量的默认类型是int.溢出是编译时错误.


例如,

package main

import "fmt"

const (
    // Create a huge number by shifting a 1 bit left 100 places.
    // In other words, the binary number that is 1 followed by 100 zeroes.
    Big = 1 << 100
)

func main() {
    var arg2 interface{} = Big
    fmt.Printf("Big is of type %T\n", arg2)

    fmt.Printf("Big is of type %T\n", Big)
}
Run Code Online (Sandbox Code Playgroud)

游乐场:https://play.golang.org/p/9tynPTek3wN

输出:

prog.go:12:6: constant 1267650600228229401496703205376 overflows int
prog.go:15:13: constant 1267650600228229401496703205376 overflows int
Run Code Online (Sandbox Code Playgroud)

参考:Go Blog:常数