Go常量和变量相关:
- 下列代码的输出是:
func main() { const ( a, b = "golang", 100 d, e f bool = true g ) fmt.Println(d, e, g) } # 输出: golang 100 true
- 在同一个const group中,如果常量定义和前一行一致,那么省略类型和值
- 下列代码的输出是:
func main() { const N = 100 var x int = N const M int32 = 100 var y int = M fmt.Println(x, y) } # 输出: 编译失败:cannot use M (type int32) as type int in assignment
- 常量分为
有类型常量
和无类型常量
- 无类型常量在赋值给其他变量时,如果字面量可以转换为对应类型变量,那么则赋值成功
- 有类型常量在赋值给其他变量时,则需要类型匹配
- 常量分为
- 下列代码的输出是:
func main() { var a int8 = -1 var b int8 = -128 / a fmt.Println(b) } # 输出: -128
- int8 能表示的数字的范围是 [-2^7, 2^7-1],即 [-128, 127]。
- -128 是无类型常量,转换为 int8,再除以变量 -1,结果为 128,常量除以变量,结果是一个变量。
- 变量转换时允许溢出,符号位变为1,转为补码后恰好等于 -128。
- 下列代码的输出是:
func main() { const a int8 = -1 var b int8 = -128 / a fmt.Println(b) } # 编译失败:constant 128 overflows int8
- -128 和 a 都是常量,在编译时求值,-128 / a = 128,两个常量相除,结果也是一个常量,常量类型转换时不允许溢出,因而编译失败。