При использовании йоты я запутался - PullRequest
0 голосов
/ 06 октября 2019

Какую версию 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}

Что вы ожидали увидеть?

Что вы видели вместо этого?

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

1 Ответ

0 голосов
/ 06 октября 2019

T.State относится к типу State. Это не имеет ничего общего с тем, что поле T.State является частью структуры или нет. Нулевое значение для типа State равно 0, что также равно Running. Поэтому, когда вы присваиваете t экземпляру T с T.State оставленным неинициализированным, T.State получает нулевое значение, равное Running.

Насколько я могу судить по кодуу вас, похоже, есть значение «Неизвестно» для State, которое является любым значением, отличным от объявленных. Если вы хотите напечатать Unknown для нулевого значения State, измените объявление констант, чтобы Unknown получило нулевое значение (то есть йоту).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...