只有常量可以是无类型的。当一个无类型的常量被赋值给一个变量的时候,或者出现在有明确类型的变量声明的右边,无类型的常量将会被隐式转换为对应的类型。
对于常量面值,不同的写法可能会对应不同的类型。例如0、0.0、0i和\u0000虽然有着相同的常量值,但是它们分别对应无类型的整数、无类型的浮点数、无类型的复数和无类型的字符等不同的常量类型。同样,true和false也是无类型的布尔类型,字符串面值常量是无类型的字符串类型。
无类型常量在使用中比较方便,不需要做类型转化:
package main
const zero float32 = 0.0
const zeroV2 = 0.0
func main() {
//_ = zero < uint64(0.0) // 报错: invalid operation: zero < uint64(0) (mismatched types float32 and uint64)
_ = zeroV2 < uint64(0.0) // 不会报错。
_ = zeroV2 < float64(0.0) // 不会报错。
_ = zeroV2 < int(0.0) // 不会报错。
_ = zeroV2 < int64(0.0) // 不会报错。
}
zeroV2 是无类型的浮点数常量,那么它可以直接和整数类型和浮点数类型进行比较。但是确定类型的常量就无法做到,比如zero 这个常量。