使用iota时,我很困惑

您使用的 Go 版本是什么(go version)?

$ go version

1.13

最新版本是否会重现此问题?

是的


您使用什么操作系统和处理器架构(go env)?

go env输出


$ go env

GOEXE=""

GOFLAGS=""

GOHOSTARCH="amd64"

GOHOSTOS="darwin"

GONOPROXY=""

GONOSUMDB=""

GOOS="darwin"

GOPATH="/Users/chezixin/go"

GOPRIVATE=""

GOPROXY="https://goproxy.io"

GOROOT="/usr/local/go"

GOSUMDB="sum.golang.org"

GOTMPDIR=""

GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"

GCCGO="gccgo"

AR="ar"

CC="clang"

CXX="clang++"

CGO_ENABLED="1"

GOMOD="/Users/chezixin/go/src/go.mod"

CGO_CFLAGS="-g -O2"

CGO_CPPFLAGS=""

CGO_CXXFLAGS="-g -O2"

CGO_FFLAGS="-g -O2"

CGO_LDFLAGS="-g -O2"

PKG_CONFIG="pkg-config"

GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/mr/_x323k891dq9yvmvlgwqf4f40000gn/T/go-build490011880=/tmp/go-build -gno-record-gcc-switches -fno-common"

你做了什么?

package main


import "fmt"


type T struct {

    Name  string

    Port  int

    State State

}


type State int


const (

    Running State = iota

    Stopped

    Rebooting

    Terminated

)

func (s State) String() string {

    switch s {

    case Running:

        return "Running"

    case Stopped:

        return "Stopped"

    case Rebooting:

        return "Rebooting"

    case Terminated:

        return "Terminated"

    default:

        return "Unknown"

    }

}


func main() {

    t := T{Name: "example", Port: 6666}

    fmt.Printf("t %+v\n", t)

}

结果:

t {Name:example Port:6666 State:Running}

您希望看到什么?


慕的地8271018
浏览 94回答 1
1回答

繁花如伊

T.State属于 类型State。这与该字段是否T.State属于结构的一部分无关。该类型的零值为State0,也等于Running。因此,当您分配给未初始化t的实例时,会得到零值,即。TT.StateT.StateRunning据我从代码中可以看出,您似乎有一个“未知”值,即除了State声明的值之外的任何值。如果您想打印Unknown的零值State,请更改常量声明,以便Unknown获得零值(即 iota)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go