@ -0,0 +1,4 @@ | |||||
{ | |||||
"Name": "Torsten", | |||||
"Age": 41 | |||||
} |
@ -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) | |||||
} |
@ -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) | |||||
} |
@ -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) | |||||
} |
@ -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() | |||||
} | |||||
} |