diff --git a/chapter_07/example_1/data.json b/chapter_07/example_1/data.json new file mode 100644 index 0000000..040c17a --- /dev/null +++ b/chapter_07/example_1/data.json @@ -0,0 +1,4 @@ +{ + "Name": "Torsten", + "Age": 41 +} \ No newline at end of file diff --git a/chapter_07/example_1/main.go b/chapter_07/example_1/main.go new file mode 100644 index 0000000..c0819f4 --- /dev/null +++ b/chapter_07/example_1/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "encoding/json" + "fmt" + "io" + "os" + "strings" +) + +type Person struct { + Name string `json:"name"` + Age int `json:"age"` +} + +func loadPerson2(s string) (Person, error) { + + var p Person + err := json.NewDecoder(strings.NewReader(s)).Decode(&p) + if err != nil { + return p, err + } + return p, nil + +} + +func loadPerson(r io.Reader) (Person, error) { + + var p Person + err := json.NewDecoder(r).Decode(&p) + if err != nil { + return p, err + } + return p, nil + +} + +func main() { + + s := `{"Name":"Joe","Age":18}` + s2 := `{"Name":"Jane","Age":21}` + + p, err := loadPerson(strings.NewReader(s)) + if err != nil { + fmt.Println(err) + } + fmt.Println(p) + + p2, err := loadPerson2(s2) + if err != nil { + fmt.Println(err) + } + fmt.Println(p2) + + f, err := os.Open("data.json") + if err != nil { + fmt.Println(err) + } + p3, err := loadPerson(f) + if err != nil { + fmt.Println(err) + } + fmt.Println(p3) + +} diff --git a/chapter_07/example_2/main.go b/chapter_07/example_2/main.go new file mode 100644 index 0000000..8cff66c --- /dev/null +++ b/chapter_07/example_2/main.go @@ -0,0 +1,33 @@ +package main + +import "fmt" + +type Speaker interface { + Speak() string +} + +type cat struct { + name string +} + +func catDetails(c cat) { + fmt.Printf("(%v, %T)\n", c, c) +} + +func emptyDetails(s interface{}) { + fmt.Printf("(%v, %T)\n", s, s) +} + +func main() { + + c := cat{"oreo"} + i := 99 + b := false + str := "test" + catDetails(c) + emptyDetails(c) + emptyDetails(i) + emptyDetails(b) + emptyDetails(str) + +} diff --git a/chapter_07/example_3/main.go b/chapter_07/example_3/main.go new file mode 100644 index 0000000..10873c8 --- /dev/null +++ b/chapter_07/example_3/main.go @@ -0,0 +1,31 @@ +package main + +import "fmt" + +type cat struct { + name string +} + +func typeExample(i []interface{}) { + + for _, x := range i { + switch v := x.(type) { + case int: + fmt.Printf("%v is an int\n", v) + case string: + fmt.Printf("%v is a string\n", v) + case bool: + fmt.Printf("%v is a boolean\n", v) + default: + fmt.Printf("Unknown type %T\n", v) + } + } +} + +func main() { + + c := cat{"oreo"} + i := []interface{}{42, "The book club", true, c} + typeExample(i) + +} diff --git a/chapter_07/exercise_7.03/main.go b/chapter_07/exercise_7.03/main.go new file mode 100644 index 0000000..fb0eb2a --- /dev/null +++ b/chapter_07/exercise_7.03/main.go @@ -0,0 +1,72 @@ +package main + +import "fmt" + +type record struct { + key string + valueType string + data interface{} +} + +type person struct { + lastName string + age int + isMarried bool +} + +type animal struct { + name string + category string +} + +func newRecord(key string, i interface{}) record { + + r := record{} + r.key = key + + switch v := i.(type) { + case int: + r.valueType = "int" + r.data = v + case bool: + r.valueType = "bool" + r.data = v + case string: + r.valueType = "string" + r.data = v + case person: + r.valueType = "person" + r.data = v + default: + r.valueType = "unknown" + r.data = v + } + return r + +} + +func main() { + + m := make(map[string]interface{}) + a := animal{name: "oreo", category: "cat"} + p := person{lastName: "Doe", isMarried: false, age: 19} + m["person"] = p + m["animal"] = a + m["age"] = 54 + m["isMarried"] = true + m["lastName"] = "Smith" + + rs := []record{} + for k, v := range m { + r := newRecord(k, v) + rs = append(rs, r) + } + + for _, v := range rs { + fmt.Println("Key:", v.key) + fmt.Println("Data:", v.data) + fmt.Println("Type:", v.valueType) + fmt.Println() + } + +}