diff --git a/go-by-example/enums/enums.go b/go-by-example/enums/enums.go new file mode 100644 index 0000000..174d100 --- /dev/null +++ b/go-by-example/enums/enums.go @@ -0,0 +1,46 @@ +package main + +import "fmt" + +type ServerState int + +const ( + StateIdle ServerState = iota + StateConnected + StateError + StateRetrying +) + +var stateName = map[ServerState]string{ + StateIdle: "idle", + StateConnected: "connected", + StateError: "error", + StateRetrying: "retrying", +} + +// String Changes the output value +func (ss ServerState) String() string { + return stateName[ss] +} + +func main() { + ns := transition(StateIdle) + fmt.Println(ns) + + ns2 := transition(ns) + fmt.Println(ns2) +} + +func transition(s ServerState) ServerState { + switch s { + case StateIdle: + return StateConnected + case StateConnected, StateRetrying: + + return StateIdle + case StateError: + return StateError + default: + panic(fmt.Errorf("unknown state: %s", s)) + } +} diff --git a/go-by-example/structs/struct-embedding/struct-embedding.go b/go-by-example/structs/struct-embedding/struct-embedding.go new file mode 100644 index 0000000..54e6a80 --- /dev/null +++ b/go-by-example/structs/struct-embedding/struct-embedding.go @@ -0,0 +1,40 @@ +package main + +import ( + "fmt" +) + +type base struct { + num int +} + +func (b base) describe() string { + return fmt.Sprintf("base with num=%v", b.num) +} + +type container struct { + base + str string +} + +func main() { + co := container{ + base: base{ + num: 1, + }, + str: "Some name", + } + fmt.Printf("co={num: %v, str: %v}\n", co.num, co.str) + + fmt.Println("also num: ", co.base.num) // also num but can be without + + // co can also use base method describe since it emebeds base + fmt.Println("describe: ", co.describe()) + + var d describer = co + fmt.Println("describer:", d.describe()) +} + +type describer interface { + describe() string +}