Browse Source

Add examples & exercise 7.02 of chapter 07

master
T. Meissner 9 months ago
parent
commit
731e51b53d
5 changed files with 205 additions and 0 deletions
  1. +4
    -0
      chapter_07/example_1/data.json
  2. +65
    -0
      chapter_07/example_1/main.go
  3. +33
    -0
      chapter_07/example_2/main.go
  4. +31
    -0
      chapter_07/example_3/main.go
  5. +72
    -0
      chapter_07/exercise_7.03/main.go

+ 4
- 0
chapter_07/example_1/data.json View File

@ -0,0 +1,4 @@
{
"Name": "Torsten",
"Age": 41
}

+ 65
- 0
chapter_07/example_1/main.go View File

@ -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)
}

+ 33
- 0
chapter_07/example_2/main.go View File

@ -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)
}

+ 31
- 0
chapter_07/example_3/main.go View File

@ -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)
}

+ 72
- 0
chapter_07/exercise_7.03/main.go View File

@ -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()
}
}

Loading…
Cancel
Save