going loopy: adventures in iteration with go

107
going loopy adventures in iteration with go [email protected] Going Loopy slideshare.net/feyeleanor

Upload: eleanor-mchugh

Post on 16-Apr-2017

376 views

Category:

Software


3 download

TRANSCRIPT

going loopyadventures in iteration with go

[email protected]

Going Loopy slideshare.net/feyeleanor

the conditional loop

Going Loopy slideshare.net/feyeleanor2

package mainimport "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {fmt.Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor3

package mainimport "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {fmt.Printf("%v: %v\n", i, s[i])

}}

0: 01: 22: 43: 64: 8

Going Loopy slideshare.net/feyeleanor4

package mainimport "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {fmt.Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor5

package mainimport "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {fmt.Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor6

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

7Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

8Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

9Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor10

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor11

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor12

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor13

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor14

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor15

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

16Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor17

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor18

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor19

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i := 0; i < len(s); i++ {Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor20

the infinite loop

Going Loopy slideshare.net/feyeleanor21

package mainimport . "fmt"

func main() {defer func() {recover()

}()s := []int{0, 2, 4, 6, 8}var i intfor {Printf("%v: %v\n", i, s[i])i++

}}

Going Loopy slideshare.net/feyeleanor22

package mainimport . "fmt"

func main() {defer func() {recover()

}()s := []int{0, 2, 4, 6, 8}var i intfor {Printf("%v: %v\n", i, s[i])i++

}}

Going Loopy slideshare.net/feyeleanor23

package mainimport . "fmt"

func main() {defer func() {recover()

}()s := []int{0, 2, 4, 6, 8}var i intfor {Printf("%v: %v\n", i, s[i])i++

}}

Going Loopy slideshare.net/feyeleanor24

package mainimport . "fmt"

func main() {defer func() {recover()

}()s := []int{0, 2, 4, 6, 8}var i intfor {Printf("%v: %v\n", i, s[i])i++

}}

Going Loopy slideshare.net/feyeleanor25

package mainimport . "fmt"

func main() {defer func() {recover()

}()s := []int{0, 2, 4, 6, 8}var i intfor {Printf("%v: %v\n", i, s[i])i++

}}

Going Loopy slideshare.net/feyeleanor26

package mainimport . "fmt"

func main() {defer func() {recover()

}()s := []int{0, 2, 4, 6, 8}var i intfor {Printf("%v: %v\n", i, s[i])i++

}}

Going Loopy slideshare.net/feyeleanor27

package mainimport . "fmt"

func main() {defer func() {recover()

}()s := []int{0, 2, 4, 6, 8}for i := 0; ; i++ {Printf("%v: %v\n", i, s[i])

}}

Going Loopy slideshare.net/feyeleanor28

the range

Going Loopy slideshare.net/feyeleanor29

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i, v := range s {Printf("%v: %v\n", i, v)

}}

Going Loopy slideshare.net/feyeleanor30

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i, v := range s {Printf("%v: %v\n", i, v)

}}

Going Loopy slideshare.net/feyeleanor31

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i, v := range s {Printf("%v: %v\n", i, v)

}}

Going Loopy slideshare.net/feyeleanor32

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i, v := range s {Printf("%v: %v\n", i, v)

}}

Going Loopy slideshare.net/feyeleanor33

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}for i, v := range s {Printf("%v: %v\n", i, v)

}}

Going Loopy slideshare.net/feyeleanor34

a functional interlude

35Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s []int) {for i, v := range s {Printf("%v: %v\n", i, v)

}}

36Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s []int) {for i, v := range s {Printf("%v: %v\n", i, v)

}}

37Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s []int) {for i, v := range s {Printf("%v: %v\n", i, v)

}}

38Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s []int) {for i, v := range s {Printf("%v: %v\n", i, v)

}}

39Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {print_slice(0, 2, 4, 6, 8)

}

func print_slice(s ...int) {for i, v := range s {Printf("%v: %v\n", i, v)

}}

40Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {print_slice(0, 2, 4, 6, 8)

}

func print_slice(s ...int) {for i, v := range s {Printf("%v: %v\n", i, v)

}}

41Going Loopy slideshare.net/feyeleanor

asserting type

Going Loopy slideshare.net/feyeleanor42

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s interface{}) {for i, v := range s.([]int) {Printf("%v: %v\n", i, v)

}}

Going Loopy slideshare.net/feyeleanor43

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s interface{}) {for i, v := range s.([]int) {Printf("%v: %v\n", i, v)

}}

Going Loopy slideshare.net/feyeleanor44

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s interface{}) {for i, v := range s.([]int) {Printf("%v: %v\n", i, v)

}}

Going Loopy slideshare.net/feyeleanor45

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s interface{}) {if s, ok := s.([]int); ok {for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

Going Loopy slideshare.net/feyeleanor46

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s interface{}) {if s, ok := s.([]int); ok {for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

Going Loopy slideshare.net/feyeleanor47

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s interface{}) {if s, ok := s.([]int); ok {for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

Going Loopy slideshare.net/feyeleanor48

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s interface{}) {if s, ok := s.([]int); ok {for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

Going Loopy slideshare.net/feyeleanor49

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s interface{}) {if s, ok := s.([]int); ok {for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

Going Loopy slideshare.net/feyeleanor50

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s interface{}) {switch s := s.(type) {case []int:for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

Going Loopy slideshare.net/feyeleanor51

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s interface{}) {switch s := s.(type) {case []int:for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

Going Loopy slideshare.net/feyeleanor52

package mainimport . "fmt"

func main() {print_slice([]int{0, 2, 4, 6, 8})

}

func print_slice(s interface{}) {switch s := s.(type) {case []int:for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

Going Loopy slideshare.net/feyeleanor53

closures

54Going Loopy slideshare.net/feyeleanor/

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_slice(func(i int) int { return s[i] })

}

func print_slice(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}}

}

55Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_slice(func(i int) int { return s[i] })

}

func print_slice(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}}

}

56Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_slice(func(i int) int { return s[i] })

}

func print_slice(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}}

}

57Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_slice(func(i int) int { return s[i] })

}

func print_slice(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}}

}

58Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_slice(func(i int) int { return s[i] })

}

func print_slice(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}}

}

59Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_slice(func(i int) int { return s[i] })

}

func print_slice(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}}

}

60Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_slice(func(i int) int { return s[i] })

}

func print_slice(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}}

}

61Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_slice(func(i int) int { return s[i] })

}

func print_slice(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}}

}

62Going Loopy slideshare.net/feyeleanor

channels

63Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {c := make(chan int)go func() {for _, v := range []int{0, 2, 4, 6, 8} {c <- v

}close(c)

}()Printf("elements: %v\n", print_channel(c))

}

func print_channel(c chan int) (i int) {for v := range c {Printf("%v: %v\n", i, v)i++

}return

}

64Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {c := make(chan int)go func() {for _, v := range []int{0, 2, 4, 6, 8} {c <- v

}close(c)

}()Printf("elements: %v\n", print_channel(c))

}

func print_channel(c chan int) (i int) {for v := range c {Printf("%v: %v\n", i, v)i++

}return

}

65Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {c := make(chan int, 16)go func() {for _, v := range []int{0, 2, 4, 6, 8} {c <- v

}close(c)

}()Printf("elements: %v\n", print_channel(c))

}

func print_channel(c chan int) (i int) {for v := range c {Printf("%v: %v\n", i, v)i++

}return

}

66Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {c := make(chan int)go func() {for _, v := range []int{0, 2, 4, 6, 8} {c <- v

}close(c)

}()Printf("elements: %v\n", print_channel(c))

}

func print_channel(c chan int) (i int) {for v := range c {Printf("%v: %v\n", i, v)i++

}return

}

67Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {c := make(chan int)go func() {for _, v := range []int{0, 2, 4, 6, 8} {c <- v

}close(c)

}()Printf("elements: %v\n", print_channel(c))

}

func print_channel(c chan int) (i int) {for v := range c {Printf("%v: %v\n", i, v)i++

}return

}

68Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {c := make(chan int)go func() {for _, v := range []int{0, 2, 4, 6, 8} {c <- v

}close(c)

}()Printf("elements: %v\n", print_channel(c))

}

func print_channel(c chan int) (i int) {for v := range c {Printf("%v: %v\n", i, v)i++

}return

}

69Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {c := make(chan int)go func() {for _, v := range []int{0, 2, 4, 6, 8} {c <- v

}close(c)

}()Printf("elements: %v\n", print_channel(c))

}

func print_channel(c chan int) (i int) {for v := range c {Printf("%v: %v\n", i, v)i++

}return

}

70Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {c := make(chan int)go func() {for _, v := range []int{0, 2, 4, 6, 8} {c <- v

}close(c)

}()Printf("elements: %v\n", print_channel(c))

}

func print_channel(c chan int) (i int) {for v := range c {Printf("%v: %v\n", i, v)i++

}return

}

71Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {c := make(chan int)go func() {for _, v := range []int{0, 2, 4, 6, 8} {c <- v

}close(c)

}()Printf("elements: %v\n", print_channel(c))

}

func print_channel(c chan int) (i int) {for v := range c {Printf("%v: %v\n", i, v)i++

}return

}

72Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {c := make(chan int)go func() {for _, v := range []int{0, 2, 4, 6, 8} {c <- v

}close(c)

}()Printf("elements: %v\n", print_channel(c))

}

func print_channel(c chan int) (i int) {for v := range c {Printf("%v: %v\n", i, v)i++

}return

}

73Going Loopy slideshare.net/feyeleanor

user-defined type

74Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

type Iterable interface {Each(func(interface{}))

}

type IterableSlice[]intfunc (i IterableSlice) Each(f func(interface{})) {

for _, v := range i {f(v)

}}

func main() {print_values(IterableSlice{ 0, 2, 4, 6, 8 })

}

func print_values(iter Iterable) {i := 0iter.Each(func(v interface{}) {Printf("%v: %v\n", i, v)i++

})}

75Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

type Iterable interface {Each(func(interface{}))

}

type IterableSlice[]intfunc (i IterableSlice) Each(f func(interface{})) {

for _, v := range i {f(v)

}}

func main() {print_values(IterableSlice{ 0, 2, 4, 6, 8 })

}

func print_values(iter Iterable) {i := 0iter.Each(func(v interface{}) {Printf("%v: %v\n", i, v)i++

})}

76Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

type Iterable interface {Each(func(interface{}))

}

type IterableSlice[]intfunc (i IterableSlice) Each(f func(interface{})) {

for _, v := range i {f(v)

}}

func main() {print_values(IterableSlice{ 0, 2, 4, 6, 8 })

}

func print_values(iter Iterable) {i := 0iter.Each(func(v interface{}) {Printf("%v: %v\n", i, v)i++

})}

77Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

type Iterable interface {Each(func(interface{}))

}

type IterableSlice []intfunc (i IterableSlice) Each(f func(interface{})) {

for _, v := range i {f(v)

}}

func main() {print_values(IterableSlice{ 0, 2, 4, 6, 8 })

}

func print_values(iter Iterable) {i := 0iter.Each(func(v interface{}) {Printf("%v: %v\n", i, v)i++

})}

78Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

type Iterable interface {Each(func(interface{}))

}

type IterableSlice []intfunc (i IterableSlice) Each(f func(interface{})) {

for _, v := range i {f(v)

}}

func main() {print_values(IterableSlice{ 0, 2, 4, 6, 8 })

}

func print_values(iter Iterable) {i := 0iter.Each(func(v interface{}) {Printf("%v: %v\n", i, v)i++

})}

79Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

type Iterable interface {Each(func(interface{}))

}

type IterableSlice []intfunc (i IterableSlice) Each(f func(interface{})) {

for _, v := range i {f(v)

}}

func main() {print_values(IterableSlice{ 0, 2, 4, 6, 8 })

}

func print_values(iter Iterable) {i := 0iter.Each(func(v interface{}) {Printf("%v: %v\n", i, v)i++

})}

80Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

type Iterable interface {Each(func(interface{}))

}

type IterableSlice []intfunc (i IterableSlice) Each(f func(interface{})) {

for _, v := range i {f(v)

}}

func main() {print_values(IterableSlice{ 0, 2, 4, 6, 8 })

}

func print_values(iter Iterable) {i := 0iter.Each(func(v interface{}) {Printf("%v: %v\n", i, v)i++

})}

81Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

type Iterable interface {Each(f func(int, interface{}))

}

type IterableSlice []intfunc (i IterableSlice) Each(f func(int, interface{})) {

for n, v := range i {f(n, v)

}}

func main() {print_values(IterableSlice{ 0, 2, 4, 6, 8 })

}

func print_values(iter Iterable) {iter.Each(func(i int, v interface{}) {Printf("%v: %v\n", i, v)

})}

82Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

type Iterable interface {Each(interface{})

}

type IterableSlice []intfunc (i IterableSlice) Each(f interface{}) {

switch f := f.(type) {case func(interface{}):for _, v := range i { f(v) }

case func(int, interface{}):for n, v := range i { f(n, v) }

}}

func main() {s := IterableSlice{ 0, 2, 4, 6, 8 }i := 0s.Each(func(v interface{}) {Printf("%v: %v\n", i, v)i++

})s.Each(func(n int, v interface{}) {Printf("%v: %v\n", n, v)

})}

83Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

type Iterable interface {Each(interface{})

}

type IterableSlice []intfunc (i IterableSlice) Each(f interface{}) {

switch f := f.(type) {case func(interface{}):for _, v := range i { f(v) }

case func(int, interface{}):for n, v := range i { f(n, v) }

}}

func main() {s := IterableSlice{ 0, 2, 4, 6, 8 }i := 0s.Each(func(v interface{}) {Printf("%v: %v\n", i, v)i++

})s.Each(func(n int, v interface{}) {Printf("%v: %v\n", n, v)

})}

84Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

type Iterable interface {Each(interface{})

}

type IterableSlice []intfunc (i IterableSlice) Each(f interface{}) {

switch f := f.(type) {case func(interface{}):for _, v := range i { f(v) }

case func(int, interface{}):for n, v := range i { f(n, v) }

}}

func main() {s := IterableSlice{ 0, 2, 4, 6, 8 }i := 0s.Each(func(v interface{}) {Printf("%v: %v\n", i, v)i++

})s.Each(func(n int, v interface{}) {Printf("%v: %v\n", n, v)

})}

85Going Loopy slideshare.net/feyeleanor

upon reflection

86Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {return s[i]

})}

func print_values(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}case []int:for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

87Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {return s[i]

})}

func print_values(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}case []int:for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

88Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {return s[i]

})}

func print_values(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}case []int:for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

89Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {return s[i]

})}

func print_values(s interface{}) {switch s := s.(type) {case func(int) int:for i := 0; i < 5; i++ {Printf("%v: %v\n", i, s(i))

}case []int:for i, v := range s {Printf("%v: %v\n", i, v)

}}

}

90Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int { return s[i] })

}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:for i := 0; i < 5; i++ {p := []Value{ ValueOf(i) }Printf("%v: %v\n", i, s.Call(p)[0].Interface())

}case Slice:for i := 0; i < s.Len(); i++ {Printf("%v: %v\n", i, s.Index(i).Interface())

}}

}

91Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int { return s[i] })

}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:for i := 0; i < 5; i++ {p := []Value{ ValueOf(i) }Printf("%v: %v\n", i, s.Call(p)[0].Interface())

}case Slice:for i := 0; i < s.Len(); i++ {Printf("%v: %v\n", i, s.Index(i).Interface())

}}

}

92Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int { return s[i] })

}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:for i := 0; i < 5; i++ {p := []Value{ ValueOf(i) }Printf("%v: %v\n", i, s.Call(p)[0].Interface())

}case Slice:for i := 0; i < s.Len(); i++ {Printf("%v: %v\n", i, s.Index(i).Interface())

}}

}

93Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int { return s[i] })

}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:for i := 0; i < 5; i++ {p := []Value{ ValueOf(i) }Printf("%v: %v\n", i, s.Call(p)[0].Interface())

}case Slice:for i := 0; i < s.Len(); i++ {Printf("%v: %v\n", i, s.Index(i).Interface())

}}

}

94Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int { return s[i] })

}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:for i := 0; i < 5; i++ {p := []Value{ ValueOf(i) }Printf("%v: %v\n", i, s.Call(p)[0].Interface())

}case Slice:for i := 0; i < s.Len(); i++ {Printf("%v: %v\n", i, s.Index(i).Interface())

}}

}

95Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {

return s[i]})print_values(func(i int) (v int, ok bool) {

defer func() {ok = recover() == nil

}()v = s[i]return

})}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:

print_func(s)case Slice:

for i := 0; i < s.Len(); i++ {print_value(i, s.Index(i))

}}

}

func print_func(s Value) {switch s.Type().NumOut() {case 1:

p := make([]Value, 1)for i := 0; i < 5; i++ {

p[0] = ValueOf(i)print_value(i, s.Call(p)[0])

}case 2:

each(s, func(i int, v Value) {print_value(i, v)

})default:

panic(s.Interface())}

}

func each(s Value, f func(int, Value)) {var i intp := []Value{ ValueOf(0) }r := s.Call(p)for r[1].Bool() {

f(i, r[0])i++p[0] = ValueOf(i)r = s.Call(p)

}}

func print_value(i int, v Value) {Printf("%v: %v\n", i, v.Interface())

}

96Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {

return s[i]})print_values(func(i int) (v int, ok bool) {

defer func() {ok = recover() == nil

}()v = s[i]return

})}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:

print_func(s)case Slice:

for i := 0; i < s.Len(); i++ {print_value(i, s.Index(i))

}}

}

func print_func(s Value) {switch s.Type().NumOut() {case 1:

p := make([]Value, 1)for i := 0; i < 5; i++ {

p[0] = ValueOf(i)print_value(i, s.Call(p)[0])

}case 2:

each(s, func(i int, v Value) {print_value(i, v)

})default:

panic(s.Interface())}

}

func each(s Value, f func(int, Value)) {var i intp := []Value{ ValueOf(0) }r := s.Call(p)for r[1].Bool() {

f(i, r[0])i++p[0] = ValueOf(i)r = s.Call(p)

}}

func print_value(i int, v Value) {Printf("%v: %v\n", i, v.Interface())

}

97Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {

return s[i]})print_values(func(i int) (v int, ok bool) {

defer func() {ok = recover() == nil

}()v = s[i]return

})}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:

print_func(s)case Slice:

for i := 0; i < s.Len(); i++ {print_value(i, s.Index(i))

}}

}

func print_func(s Value) {switch s.Type().NumOut() {case 1:

p := make([]Value, 1)for i := 0; i < 5; i++ {

p[0] = ValueOf(i)print_value(i, s.Call(p)[0])

}case 2:

each(s, func(i int, v Value) {print_value(i, v)

})default:

panic(s.Interface())}

}

func each(s Value, f func(int, Value)) {var i intp := []Value{ ValueOf(0) }r := s.Call(p)for r[1].Bool() {

f(i, r[0])i++p[0] = ValueOf(i)r = s.Call(p)

}}

func print_value(i int, v Value) {Printf("%v: %v\n", i, v.Interface())

}

98Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {

return s[i]})print_values(func(i int) (v int, ok bool) {

defer func() {ok = recover() == nil

}()v = s[i]return

})}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:

print_func(s)case Slice:

for i := 0; i < s.Len(); i++ {print_value(i, s.Index(i))

}}

}

func print_func(s Value) {switch s.Type().NumOut() {case 1:

p := make([]Value, 1)for i := 0; i < 5; i++ {

p[0] = ValueOf(i)print_value(i, s.Call(p)[0])

}case 2:

each(s, func(i int, v Value) {print_value(i, v)

})default:

panic(s.Interface())}

}

func each(s Value, f func(int, Value)) {var i intp := []Value{ ValueOf(0) }r := s.Call(p)for r[1].Bool() {

f(i, r[0])i++p[0] = ValueOf(i)r = s.Call(p)

}}

func print_value(i int, v Value) {Printf("%v: %v\n", i, v.Interface())

}

99Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {

return s[i]})print_values(func(i int) (v int, ok bool) {

defer func() {ok = recover() == nil

}()v = s[i]return

})}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:

print_func(s)case Slice:

for i := 0; i < s.Len(); i++ {print_value(i, s.Index(i))

}}

}

func print_func(s Value) {switch s.Type().NumOut() {case 1:

p := make([]Value, 1)for i := 0; i < 5; i++ {

p[0] = ValueOf(i)print_value(i, s.Call(p)[0])

}case 2:

each(s, func(i int, v Value) {print_value(i, v)

})default:

panic(s.Interface())}

}

func each(s Value, f func(int, Value)) {var i intp := []Value{ ValueOf(0) }r := s.Call(p)for r[1].Bool() {

f(i, r[0])i++p[0] = ValueOf(i)r = s.Call(p)

}}

func print_value(i int, v Value) {Printf("%v: %v\n", i, v.Interface())

}

100Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {

return s[i]})print_values(func(i int) (v int, ok bool) {

defer func() {ok = recover() == nil

}()v = s[i]return

})}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:

print_func(s)case Slice:

for i := 0; i < s.Len(); i++ {print_value(i, s.Index(i))

}}

}

func print_func(s Value) {switch s.Type().NumOut() {case 1:

p := make([]Value, 1)for i := 0; i < 5; i++ {

p[0] = ValueOf(i)print_value(i, s.Call(p)[0])

}case 2:

each(s, func(i int, v Value) {print_value(i, v)

})default:

panic(s.Interface())}

}

func each(s Value, f func(int, Value)) {var i intp := []Value{ ValueOf(0) }r := s.Call(p)for r[1].Bool() {

f(i, r[0])i++p[0] = ValueOf(i)r = s.Call(p)

}}

func print_value(i int, v Value) {Printf("%v: %v\n", i, v.Interface())

}

101Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {

return s[i]})print_values(func(i int) (v int, ok bool) {

defer func() {ok = recover() == nil

}()v = s[i]return

})}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:

print_func(s)case Slice:

for i := 0; i < s.Len(); i++ {print_value(i, s.Index(i))

}}

}

func print_func(s Value) {switch s.Type().NumOut() {case 1:

p := make([]Value, 1)for i := 0; i < 5; i++ {

p[0] = ValueOf(i)print_value(i, s.Call(p)[0])

}case 2:

each(s, func(i int, v Value) {print_value(i, v)

})default:

panic(s.Interface())}

}

func each(s Value, f func(int, Value)) {var i intp := []Value{ ValueOf(0) }r := s.Call(p)for r[1].Bool() {

f(i, r[0])i++p[0] = ValueOf(i)r = s.Call(p)

}}

func print_value(i int, v Value) {Printf("%v: %v\n", i, v.Interface())

}

102Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {

return s[i]})print_values(func(i int) (v int, ok bool) {

defer func() {ok = recover() == nil

}()v = s[i]return

})}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:

print_func(s)case Slice:

for i := 0; i < s.Len(); i++ {print_value(i, s.Index(i))

}}

}

func print_func(s Value) {switch s.Type().NumOut() {case 1:

p := make([]Value, 1)for i := 0; i < 5; i++ {

p[0] = ValueOf(i)print_value(i, s.Call(p)[0])

}case 2:

each(s, func(i int, v Value) {print_value(i, v)

})default:

panic(s.Interface())}

}

func each(s Value, f func(int, Value)) {var i intp := []Value{ ValueOf(0) }r := s.Call(p)for r[1].Bool() {

f(i, r[0])i++p[0] = ValueOf(i)r = s.Call(p)

}}

func print_value(i int, v Value) {Printf("%v: %v\n", i, v.Interface())

}

103Going Loopy slideshare.net/feyeleanor

package mainimport . "fmt"import . "reflect"

func main() {s := []int{0, 2, 4, 6, 8}print_values(s)print_values(func(i int) int {

return s[i]})print_values(func(i int) (v int, ok bool) {

defer func() {ok = recover() == nil

}()v = s[i]return

})}

func print_values(s interface{}) {switch s := ValueOf(s); s.Kind() {case Func:

print_func(s)case Slice:

for i := 0; i < s.Len(); i++ {print_value(i, s.Index(i))

}}

}

func print_func(s Value) {switch s.Type().NumOut() {case 1:

p := make([]Value, 1)for i := 0; i < 5; i++ {

p[0] = ValueOf(i)print_value(i, s.Call(p)[0])

}case 2:

each(s, func(i int, v Value) {print_value(i, v)

})default:

panic(s.Interface())}

}

func each(s Value, f func(int, Value)) {var i intp := []Value{ ValueOf(0) }r := s.Call(p)for r[1].Bool() {

f(i, r[0])i++p[0] = ValueOf(i)r = s.Call(p)

}}

func print_value(i int, v Value) {Printf("%v: %v\n", i, v.Interface())

}

104Going Loopy slideshare.net/feyeleanor

you now know go

Going Loopy 112 slideshare.net/feyeleanor

#golang

Going Loopy 113 slideshare.net/feyeleanor

http://golang.org/

Going Loopy 114 slideshare.net/feyeleanor