When using iota, I am confused

C

chezi chezi

Guest
What version of Go are you using (go version)?


$ go version
1.13

Does this issue reproduce with the latest release?


yes

What operating system and processor architecture are you using (go env)?


go env Output

$ 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"

What did you do?


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)
}

Result:


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

What did you expect to see?

What did you see instead?



Although the string is rewritten, this is related to State.const.
I am printing a T struct in main. The zero value is 0.
But why do you want to display State:Running

When T.State = 0, why does the program think T.State = const.Running?

I understand this now:
String is an interface type, T.State=0, const.Running=0, the two types are the same, the value is the same, the program will think that the two are equal? Doesn't it distinguish between const and struct at the moment?
According to logic, you should distinguish between const and struct, but the program thinks they are equal. Is this a bug? Or am I getting into a misunderstanding?

Can you tell me how to understand it correctly?
thank you very much
Thank you

Continue reading...
 
Top