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)
为什么我无法通过这种方式发现常数的类型?(请注意我是一个完全的菜鸟,很可能还没有发现足够的语言能够自己解决这个问题).
Run Code Online (Sandbox Code Playgroud)func Printf(format string, a ...interface{}) (n int, err error)
Printf根据格式说明符格式化并写入标准输出.它返回写入的字节数和遇到的任何写入错误.
变量声明创建一个或多个变量,将相应的标识符绑定到它们,并为每个变量赋予类型和初始值.
如果给出了表达式列表,则使用遵循赋值规则的表达式初始化变量.否则,每个变量都初始化为零值.
如果存在类型,则为每个变量赋予该类型.否则,为每个变量赋予赋值中相应初始化值的类型.如果该值是无类型常量,则首先将其转换为其默认类型; 如果它是无类型的布尔值,则首先将其转换为bool类型.预先声明的值nil不能用于初始化没有显式类型的变量.
常量可以是打字的或无类型的.仅包含无类型常量操作数的文字常量,true,false,iota和某些常量表达式是无类型的.
常量可以通过常量声明或转换显式给定,或者在变量声明或赋值中使用时隐式赋值,或者作为表达式中的操作数使用.如果常量值不能表示为相应类型的值,则会出错.
无类型常量具有默认类型,该类型是在需要类型化值的上下文中隐式转换常量的类型,例如,在短变量声明中,例如i:= 0,其中没有显式类型.无类型常量的默认类型分别是bool,rune,int,float64,complex128或string,具体取决于它是布尔值,符文,整数,浮点数,复数还是字符串常量.
数字类型表示整数或浮点值的集合.一些预先声明的与体系结构无关的数字类型:
Run Code Online (Sandbox Code Playgroud)int32 the set of all signed 32-bit integers (-2147483648 to 2147483647) int64 the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)
n位整数的值是n位宽,并使用二进制补码算法表示.
还有一些具有特定于实现的大小的预先声明的数字类型:
Run Code Online (Sandbox Code Playgroud)uint either 32 or 64 bits int same size as uint
Big
是一个无类型的常数.没有类型可以发现.在变量或赋值中使用时,它会被赋予类型.无类型常量的默认类型Big
是int
.
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:常数