|
Výčtové typy (enums) jsou speciálním případem součtových typů. Výčtový typ je typ, který má pevný počet možných hodnot, každou s odlišným názvem. Go nemá výčtový typ jako samostatnou vlastnost jazyka, ale výčtové typy se dají jednoduše implementovat pomocí existujících idiomů jazyka. |
|
![]()
package main
|
|
import "fmt"
|
|
|
Náš výčtový typ |
type ServerState int
|
|
Možné hodnoty |
const (
StateIdle ServerState = iota
StateConnected
StateError
StateRetrying
)
|
|
Díky implementaci interface fmt.Stringer
je možné hodnoty |
//
|
|
Pokud je možných hodnot hodně, může to být těžkopádné.
V takových případech je možné použít
nástroj stringer
spolu s |
var stateName = map[ServerState]string{
StateIdle: "nečinný",
StateConnected: "připojený",
StateError: "chyba",
StateRetrying: "opakování",
}
|
func (ss ServerState) String() string {
return stateName[ss]
}
|
|
|
Pokud máme hodnotu typu |
func main() {
ns := transition(StateIdle)
fmt.Println(ns)
|
ns2 := transition(ns)
fmt.Println(ns2)
}
|
|
|
transition napodobuje přechod mezi stavy serveru; převezme existující stav a vrátí nový stav. |
func transition(s ServerState) ServerState {
switch s {
case StateIdle:
return StateConnected
case StateConnected, StateRetrying:
|
|
Předpokládejme, že tady kontrolujeme nějaké podmínky, abychom určili další stav… |
return StateIdle
case StateError:
return StateError
default:
panic(fmt.Errorf("neznámý stav: %s", s))
}
}
|
$ go run enums.go
připojený
nečinný
|
Další příklad: Vkládání struktur (embedding).