为什么数字 01000 会转换为 512?

Dan*_*bey 0 struct go

几天前我开始学习 Go,在学习过程中structs我遇到了一个例子,我想创建一个联系人结构,并且邮政编码 01000 在终端上打印为 512,而不是 01000

这是代码块:

package main

import "fmt"

type contactInfo struct {
    email   string
    zipCode int
}

type person struct {
    firstName string
    lastName  string
    contact   contactInfo
}

func main() {
    jim := person{
        firstName: "Jim",
        lastName:  "Party",
        contact:   contactInfo{email: "jim.party@gmail.com", zipCode: 01000},
    }

    fmt.Printf("%+v", jim)
}
Run Code Online (Sandbox Code Playgroud)

这是终端的输出:

{firstName:Jim lastName:Party contact:{email:jim.party@gmail.com zipCode:512}}%  
Run Code Online (Sandbox Code Playgroud)

我使用该命令go run main.go并期望 01000 作为邮政编码,但我得到的是 512。

Fli*_*mzy 6

因为0前缀表示八进制。我们可以在Go 规范中了解这一点:

octal_lit      = "0" [ "o" | "O" ] [ "_" ] octal_digits .
Run Code Online (Sandbox Code Playgroud)

因此,文字字符串01000被解释为 1 * 8^3 + 0 * 8^2 + 0 * 8^1 + 0 * 8^0 = 512。

从Go 1.13开始,当您打算使用八进制时,您可以(并且可能“应该”)使用约定代替0o,以提高可读性。0也就是说,最好写成0o1000,因为这样在视觉上更清晰,更清楚八进制的意图。


在您的具体情况下,您应该将邮政编码视为字符串,而不是数字。