常量不同于变量的在运行期分配内存,常量通常会被编译器在预处理阶段直接展开,作为指令数据使用,所以常量无法寻址。
const i = 100
var j = 123
func main() {
fmt.Println(&j, j)
fmt.Println(&i, i)
}
编译报错cannot take the address of i。
func test(x byte) {
fmt.Println(x)
}
func main() {
var a byte = 0x11
var b uint8 = a
var c uint8 = a + b
test(c)
}
与 rune 是 int32 的别名一样,byte 是 uint8 的别名,系统内置的别名类型无需转换,可直接计算
- uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
- rune类型,代表一个 Unicode或UTF-8字符。rune类型实际是一个int32
type byte = uint8
type rune = int32
Go 语言里面,八进制数以 0 开头,十六进制数以 0x 开头,所以 Decade 表示十进制的 8。
const (
Century = 100
Decade = 010
Year = 001
)
func main() {
fmt.Println(Century + 2*Decade + 2*Year) //118
}
afdasdf
package main
const s = "Go101.org"
// len(s) == 9
// 1 << 9 == 512
// 512 / 128 == 4
var a byte = 1 << len(s) / 128
var b byte = 1 << len(s[:]) / 128
func main() {
println(a, b)
}
在位移表达式的右侧的操作数必须为整数类型,或者可以被 uint 类型的值所表示的无类型的常量。如果一个非常量位移表达式的左侧的操作数是一个无类型常量,那么它会先被隐式地转换为假如位移表达式被其左侧操作数单独替换后的类型。
第一句的 len(s) 是常量(因为 s 是字符串常量);而第二句的 len(s[:]) 不是常量。这是这两条语句的唯一区别:两个 len 的返回结果数值并无差异,都是 9,但一个是常量一个不是。所以 var b byte = 1 << len(s[:]) / 128
中,根据规范定义,1 会隐式转换为 byte 类型,因此 1 << len(s[:])
的结果也是 byte 类型,而 byte 类型最大只能表示 255,很显然 512 溢出了,结果为 0,因此最后 b 的结果也是 0。