为什么 fmt.Prinft() 将 `const` 记录在其他包中,例如内存地址?

问题描述

当参数为 fmt.Printf()%x? 时,var 如何处理 const。我从书中读到 const 之前没有指定 Type,很难理解。

const AValue int32 = 1049088

func main() {
    fmt.Printf("%#x\n",1049088)
    fmt.Printf("%#x\n",AValue)

    fmt.Printf("%#x\n",int(time.Friday))
    fmt.Printf("%#x\n",time.Friday)
}

日志:

0x100200 // 1049088
0x100200 // AValue
0x5 // int(time.Friday)
0x467269646179 // time.Friday is a type Weekday int


Is `0x467269646179` some kind address of time.Friday?

解决方法

来自docs

除非使用动词 %T 和 %p 打印,特殊格式 考虑适用于实现某些接口的操作数。 申请顺序:
...
5.如果一个操作数实现了方法String()字符串,该方法将被调用将对象转换为字符串,然后将 按照动词(如果有)的要求格式化

对于 string,动词格式定义为:

%s  the uninterpreted bytes of the string or slice
%q  a double-quoted string safely escaped with Go syntax
%x  base 16,lower-case,two characters per byte
%X  base 16,upper-case,two characters per byte

所以 0x467269646179base 16,two characters per byte 输出的 time.Friday.String()

https://play.golang.org/p/avV-X2uiL1D