more exercises
This commit is contained in:
parent
ce06a799d1
commit
4569b3ac46
18
empty-interface.go
Normal file
18
empty-interface.go
Normal file
@ -0,0 +1,18 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
var i interface{}
|
||||
describe(i)
|
||||
|
||||
i = 42
|
||||
describe(i)
|
||||
|
||||
i = "hello"
|
||||
describe(i)
|
||||
}
|
||||
|
||||
func describe(i interface{}) {
|
||||
fmt.Printf("(%v, %T)\n", i, i)
|
||||
}
|
29
errors.go
Normal file
29
errors.go
Normal file
@ -0,0 +1,29 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
type MyError struct {
|
||||
When time.Time
|
||||
What string
|
||||
}
|
||||
|
||||
func (e *MyError) Error() string {
|
||||
return fmt.Sprintf("at %v, %s",
|
||||
e.When, e.What)
|
||||
}
|
||||
|
||||
func run() error {
|
||||
return &MyError{
|
||||
time.Now(),
|
||||
"it didn't work",
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
if err := run(); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
21
exercise-stringer.go
Normal file
21
exercise-stringer.go
Normal file
@ -0,0 +1,21 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type IPAddr [4]byte
|
||||
|
||||
func (ip IPAddr) String() string {
|
||||
return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
|
||||
}
|
||||
|
||||
// TODO: Add a "String() string" method to IPaddr
|
||||
|
||||
func main() {
|
||||
hosts := map[string]IPAddr{
|
||||
"loopback": {127, 0, 0, 1},
|
||||
"googleDNS": {8, 8, 8, 8},
|
||||
}
|
||||
for name, ip := range hosts {
|
||||
fmt.Printf("%v: %v\n", name, ip)
|
||||
}
|
||||
}
|
36
interface-values-with-nil.go
Normal file
36
interface-values-with-nil.go
Normal file
@ -0,0 +1,36 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type I interface {
|
||||
M()
|
||||
}
|
||||
|
||||
type T struct {
|
||||
S string
|
||||
}
|
||||
|
||||
func (t *T) M() {
|
||||
if t == nil {
|
||||
fmt.Println("<nil>")
|
||||
return
|
||||
}
|
||||
fmt.Println(t.S)
|
||||
}
|
||||
|
||||
func main() {
|
||||
var i I
|
||||
|
||||
var t *T
|
||||
i = t
|
||||
describe(i)
|
||||
i.M()
|
||||
|
||||
i = &T{"hello"}
|
||||
describe(i)
|
||||
i.M()
|
||||
}
|
||||
|
||||
func describe(i I) {
|
||||
fmt.Printf("(%v, %T)\n", i, i)
|
||||
}
|
40
interface-values.go
Normal file
40
interface-values.go
Normal file
@ -0,0 +1,40 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
type I interface {
|
||||
M()
|
||||
}
|
||||
|
||||
type T struct {
|
||||
S string
|
||||
}
|
||||
|
||||
func (t *T) M() {
|
||||
fmt.Println(t.S)
|
||||
}
|
||||
|
||||
type F float64
|
||||
|
||||
func (f F) M() {
|
||||
fmt.Println(f)
|
||||
}
|
||||
|
||||
func main() {
|
||||
var i I
|
||||
|
||||
i = &T{"Hello"}
|
||||
describe(i)
|
||||
i.M()
|
||||
|
||||
i = F(math.Pi)
|
||||
describe(i)
|
||||
i.M()
|
||||
}
|
||||
|
||||
func describe(i I) {
|
||||
fmt.Printf("(%v, %T)\n", i, i)
|
||||
}
|
22
interfaces-are-satisfied-implicitly.go
Normal file
22
interfaces-are-satisfied-implicitly.go
Normal file
@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type I interface {
|
||||
M()
|
||||
}
|
||||
|
||||
type T struct {
|
||||
S string
|
||||
}
|
||||
|
||||
// This method means type T implements the interface I,
|
||||
// but we don't need to explicitly declare that it does so.
|
||||
func (t T) M() {
|
||||
fmt.Println(t.S)
|
||||
}
|
||||
|
||||
func main() {
|
||||
var i I = T{"hello"}
|
||||
i.M()
|
||||
}
|
17
nil-interface-values.go
Normal file
17
nil-interface-values.go
Normal file
@ -0,0 +1,17 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type I interface {
|
||||
M()
|
||||
}
|
||||
|
||||
func main() {
|
||||
var i I
|
||||
describe(i)
|
||||
i.M()
|
||||
}
|
||||
|
||||
func describe(i I) {
|
||||
fmt.Printf("(%v, %T)\n", i, i)
|
||||
}
|
18
stringer.go
Normal file
18
stringer.go
Normal file
@ -0,0 +1,18 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Person struct {
|
||||
Name string
|
||||
Age int
|
||||
}
|
||||
|
||||
func (p Person) String() string {
|
||||
return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
|
||||
}
|
||||
|
||||
func main() {
|
||||
a := Person{"Arthur Dent", 42}
|
||||
z := Person{"Zaphod Beeblebrox", 9001}
|
||||
fmt.Println(a, z)
|
||||
}
|
19
type-assertions.go
Normal file
19
type-assertions.go
Normal file
@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
var i interface{} = "hello"
|
||||
|
||||
s := i.(string)
|
||||
fmt.Println(s)
|
||||
|
||||
s, ok := i.(string)
|
||||
fmt.Println(s, ok)
|
||||
|
||||
f, ok := i.(float64)
|
||||
fmt.Println(f, ok)
|
||||
|
||||
f = i.(float64) // panic
|
||||
fmt.Println(f)
|
||||
}
|
20
type-switches.go
Normal file
20
type-switches.go
Normal file
@ -0,0 +1,20 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func do(i interface{}) {
|
||||
switch v := i.(type) {
|
||||
case int:
|
||||
fmt.Printf("Twice %v is %v\n", v, v * 2)
|
||||
case string:
|
||||
fmt.Printf("%q is %v bytes long\n", v, len(v))
|
||||
default:
|
||||
fmt.Printf("I don't know about type %T!\n", v)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
do(21)
|
||||
do("hello")
|
||||
do(true)
|
||||
}
|
Loading…
Reference in New Issue
Block a user