package main
import "fmt"
// Enum tipi ServerState, ostki turi int
type ServerState int
// Mavjud qiymatlar iota orqali ketma-ket generatsiya qilinadi (0, 1, 2, ...)
const (
StateIdle ServerState = iota
StateConnected
StateError
StateRetrying
)
// fmt.Stringer interfeysini amalga oshirish orqali qiymatlarni matnga oson aylantiramiz
var stateName = map[ServerState]string{
StateIdle: "idle",
StateConnected: "connected",
StateError: "error",
StateRetrying: "retrying",
}
func (ss ServerState) String() string {
return stateName[ss]
}
// Serverning holatini o'zgartirishni emulyatsiya qiladi
func transition(s ServerState) ServerState {
switch s {
case StateIdle:
return StateConnected
case StateConnected, StateRetrying:
// Bu yerda keyingi holatni aniqlash uchun qo'shimcha shartlarni tekshirish mumkin
return StateIdle
case StateError:
return StateError
default:
panic(fmt.Errorf("unknown state: %s", s))
}
}
func main() {
// int tipidagi qiymatni bevosita transition'ga uzata olmaysiz — tip mos kelmasligi kompilyatsiya paytida aniqlanadi
ns := transition(StateIdle)
fmt.Println(ns)
ns2 := transition(ns)
fmt.Println(ns2)
}
Terminalda bajarish:
$ go run enums.go
connected
idle
Ko'p qiymatli enumlar uchun String() yozish qo'l mehnati talab etishi mumkin. Bunday holatda stringer vositasidan go:generate bilan birga foydalanish mumkin.