跳到主要内容

常量

Go 常量有哪些声明形式与类型?​

  • const: 编译期确定的不可修改值;
const Pi = 3.14 // 常量值在编译期确定

const (
StatusOK = 200
Method = "GET"
)

无类型常量如何根据上下文转换类型?​

  • 在需要具体类型时由上下文确定类型;
  • 值必须能由目标类型表示;例如常量 256 不能赋给 uint8;
const n = 10 // n 为 untyped constant

var i int = n // n 根据上下文转换为 int
var f float64 = n // n 根据上下文转换为 float64

iota 的初始值与递增规则是什么?​

  • iota: const block 内的递增计数器;
  • 初始值: 每个 const block 从 0 开始;
  • 递增时机: 每个常量声明项(ConstSpec)递增一次;
const (
Sunday = iota // 0
Monday // 1; 省略表达式时重复上一行非空表达式
Tuesday // 2
)

bit flag 是什么, 如何用 1 << iota 生成标志位?​

  • bit flag: 使用二进制位组合多个布尔状态;
  • 位移表达式: 1 << iota 常用于生成独立标志位;
const (
Read = 1 << iota // 1; 二进制 001
Write // 2; 二进制 010
Exec // 4; 二进制 100
)

bit flag 应用场景是什么​

  • 用按位或组合权限,用按位与判断某位是否存在;常量只负责给每一位命名,不限制业务上允许哪些组合;
permissions := Read | Write
canRead := permissions&Read != 0
canExec := permissions&Exec != 0
println(canRead, canExec) // true false