面试题答案
一键面试package main
import "fmt"
// 定义文件权限常量组
type FileMode uint32
const (
// 可读权限
Read FileMode = 1 << iota
// 可写权限
Write
// 可执行权限
Execute
// 可读可写权限
ReadWrite = Read | Write
// 可读可执行权限
ReadExecute = Read | Execute
// 可写可执行权限
WriteExecute = Write | Execute
// 可读可写可执行权限
ReadWriteExecute = Read | Write | Execute
)
func main() {
fmt.Printf("Read: %d\n", Read)
fmt.Printf("Write: %d\n", Write)
fmt.Printf("Execute: %d\n", Execute)
fmt.Printf("ReadWrite: %d\n", ReadWrite)
fmt.Printf("ReadExecute: %d\n", ReadExecute)
fmt.Printf("WriteExecute: %d\n", WriteExecute)
fmt.Printf("ReadWriteExecute: %d\n", ReadWriteExecute)
}
iota
的值变化规律
在Go语言中,iota
是一个在常量声明中使用的计数器,从0开始,每当遇到一个新的常量声明时,iota
会自动递增1。在上述代码中:
- 当定义
Read
时,iota
的值为0,所以Read = 1 << 0 = 1
。 - 定义
Write
时,iota
自动递增为1,所以Write = 1 << 1 = 2
。 - 定义
Execute
时,iota
递增为2,所以Execute = 1 << 2 = 4
。
类型推导机制
在这个常量组定义中,第一个常量Read
显式地指定了类型为FileMode
(实际是uint32
的别名)。后续的常量如果没有显式指定类型,会自动推导为与第一个常量相同的类型,即FileMode
类型。所以Write
、Execute
等常量虽然没有显式指定类型,但它们的类型也是FileMode
。在进行位运算组合权限时,由于操作数类型相同,所以可以直接进行按位或(|
)操作,得到的结果类型同样是FileMode
。