going loopy
adventures in iteration with go
e.mchugh@inidsol.uk
Going Loopy slideshare.net/feyeleanor
the conditional loop
Going Loopy slideshare.net/feyeleanor2
package main
import "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
fmt.Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor3
package main
import "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
fmt.Printf("%v: %vn", i, s[i])
}
}
0: 0
1: 2
2: 4
3: 6
4: 8
Going Loopy slideshare.net/feyeleanor4
package main
import "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
fmt.Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor5
package main
import "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
fmt.Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor6
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
7Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
8Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
9Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor10
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor11
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor12
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor13
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor14
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor15
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
16Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor17
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor18
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor19
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i := 0; i < len(s); i++ {
Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor20
the infinite loop
Going Loopy slideshare.net/feyeleanor21
package main
import . "fmt"
func main() {
defer func() {
recover()
}()
s := []int{0, 2, 4, 6, 8}
var i int
for {
Printf("%v: %vn", i, s[i])
i++
}
}
Going Loopy slideshare.net/feyeleanor22
package main
import . "fmt"
func main() {
defer func() {
recover()
}()
s := []int{0, 2, 4, 6, 8}
var i int
for {
Printf("%v: %vn", i, s[i])
i++
}
}
Going Loopy slideshare.net/feyeleanor23
package main
import . "fmt"
func main() {
defer func() {
recover()
}()
s := []int{0, 2, 4, 6, 8}
var i int
for {
Printf("%v: %vn", i, s[i])
i++
}
}
Going Loopy slideshare.net/feyeleanor24
package main
import . "fmt"
func main() {
defer func() {
recover()
}()
s := []int{0, 2, 4, 6, 8}
var i int
for {
Printf("%v: %vn", i, s[i])
i++
}
}
Going Loopy slideshare.net/feyeleanor25
package main
import . "fmt"
func main() {
defer func() {
recover()
}()
s := []int{0, 2, 4, 6, 8}
var i int
for {
Printf("%v: %vn", i, s[i])
i++
}
}
Going Loopy slideshare.net/feyeleanor26
package main
import . "fmt"
func main() {
defer func() {
recover()
}()
s := []int{0, 2, 4, 6, 8}
var i int
for {
Printf("%v: %vn", i, s[i])
i++
}
}
Going Loopy slideshare.net/feyeleanor27
package main
import . "fmt"
func main() {
defer func() {
recover()
}()
s := []int{0, 2, 4, 6, 8}
for i := 0; ; i++ {
Printf("%v: %vn", i, s[i])
}
}
Going Loopy slideshare.net/feyeleanor28
the range
Going Loopy slideshare.net/feyeleanor29
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
Going Loopy slideshare.net/feyeleanor30
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
Going Loopy slideshare.net/feyeleanor31
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
Going Loopy slideshare.net/feyeleanor32
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
Going Loopy slideshare.net/feyeleanor33
package main
import . "fmt"
func main() {
s := []int{0, 2, 4, 6, 8}
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
Going Loopy slideshare.net/feyeleanor34
a functional interlude
35Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
print_slice([]int{0, 2, 4, 6, 8})
}
func print_slice(s []int) {
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
36Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
print_slice([]int{0, 2, 4, 6, 8})
}
func print_slice(s []int) {
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
37Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
print_slice([]int{0, 2, 4, 6, 8})
}
func print_slice(s []int) {
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
38Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
print_slice([]int{0, 2, 4, 6, 8})
}
func print_slice(s []int) {
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
39Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
print_slice(0, 2, 4, 6, 8)
}
func print_slice(s ...int) {
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
40Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
print_slice(0, 2, 4, 6, 8)
}
func print_slice(s ...int) {
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
41Going Loopy slideshare.net/feyeleanor
asserting type
Going Loopy slideshare.net/feyeleanor42
package main
import . "fmt"
func main() {
print_slice([]int{0, 2, 4, 6, 8})
}
func print_slice(s interface{}) {
for i, v := range s.([]int) {
Printf("%v: %vn", i, v)
}
}
Going Loopy slideshare.net/feyeleanor43
package main
import . "fmt"
func main() {
print_slice([]int{0, 2, 4, 6, 8})
}
func print_slice(s interface{}) {
for i, v := range s.([]int) {
Printf("%v: %vn", i, v)
}
}
Going Loopy slideshare.net/feyeleanor44
package main
import . "fmt"
func main() {
print_slice([]int{0, 2, 4, 6, 8})
}
func print_slice(s interface{}) {
for i, v := range s.([]int) {
Printf("%v: %vn", i, v)
}
}
Going Loopy slideshare.net/feyeleanor45
package main
import . "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: %vn", i, v)
}
}
}
Going Loopy slideshare.net/feyeleanor46
package main
import . "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: %vn", i, v)
}
}
}
Going Loopy slideshare.net/feyeleanor47
package main
import . "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: %vn", i, v)
}
}
}
Going Loopy slideshare.net/feyeleanor48
package main
import . "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: %vn", i, v)
}
}
}
Going Loopy slideshare.net/feyeleanor49
package main
import . "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: %vn", i, v)
}
}
}
Going Loopy slideshare.net/feyeleanor50
package main
import . "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: %vn", i, v)
}
}
}
Going Loopy slideshare.net/feyeleanor51
package main
import . "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: %vn", i, v)
}
}
}
Going Loopy slideshare.net/feyeleanor52
package main
import . "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: %vn", i, v)
}
}
}
Going Loopy slideshare.net/feyeleanor53
closures
54Going Loopy slideshare.net/feyeleanor/
package main
import . "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: %vn", i, s(i))
}
}
}
55Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s(i))
}
}
}
56Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s(i))
}
}
}
57Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s(i))
}
}
}
58Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s(i))
}
}
}
59Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s(i))
}
}
}
60Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s(i))
}
}
}
61Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s(i))
}
}
}
62Going Loopy slideshare.net/feyeleanor
channels
63Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
c := make(chan int)
go func() {
for _, v := range []int{0, 2, 4, 6, 8} {
c <- v
}
close(c)
}()
Printf("elements: %vn", print_channel(c))
}
func print_channel(c chan int) (i int) {
for v := range c {
Printf("%v: %vn", i, v)
i++
}
return
}
64Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
c := make(chan int)
go func() {
for _, v := range []int{0, 2, 4, 6, 8} {
c <- v
}
close(c)
}()
Printf("elements: %vn", print_channel(c))
}
func print_channel(c chan int) (i int) {
for v := range c {
Printf("%v: %vn", i, v)
i++
}
return
}
65Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", print_channel(c))
}
func print_channel(c chan int) (i int) {
for v := range c {
Printf("%v: %vn", i, v)
i++
}
return
}
66Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
c := make(chan int)
go func() {
for _, v := range []int{0, 2, 4, 6, 8} {
c <- v
}
close(c)
}()
Printf("elements: %vn", print_channel(c))
}
func print_channel(c chan int) (i int) {
for v := range c {
Printf("%v: %vn", i, v)
i++
}
return
}
67Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
c := make(chan int)
go func() {
for _, v := range []int{0, 2, 4, 6, 8} {
c <- v
}
close(c)
}()
Printf("elements: %vn", print_channel(c))
}
func print_channel(c chan int) (i int) {
for v := range c {
Printf("%v: %vn", i, v)
i++
}
return
}
68Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
c := make(chan int)
go func() {
for _, v := range []int{0, 2, 4, 6, 8} {
c <- v
}
close(c)
}()
Printf("elements: %vn", print_channel(c))
}
func print_channel(c chan int) (i int) {
for v := range c {
Printf("%v: %vn", i, v)
i++
}
return
}
69Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
c := make(chan int)
go func() {
for _, v := range []int{0, 2, 4, 6, 8} {
c <- v
}
close(c)
}()
Printf("elements: %vn", print_channel(c))
}
func print_channel(c chan int) (i int) {
for v := range c {
Printf("%v: %vn", i, v)
i++
}
return
}
70Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
c := make(chan int)
go func() {
for _, v := range []int{0, 2, 4, 6, 8} {
c <- v
}
close(c)
}()
Printf("elements: %vn", print_channel(c))
}
func print_channel(c chan int) (i int) {
for v := range c {
Printf("%v: %vn", i, v)
i++
}
return
}
71Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
c := make(chan int)
go func() {
for _, v := range []int{0, 2, 4, 6, 8} {
c <- v
}
close(c)
}()
Printf("elements: %vn", print_channel(c))
}
func print_channel(c chan int) (i int) {
for v := range c {
Printf("%v: %vn", i, v)
i++
}
return
}
72Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
func main() {
c := make(chan int)
go func() {
for _, v := range []int{0, 2, 4, 6, 8} {
c <- v
}
close(c)
}()
Printf("elements: %vn", print_channel(c))
}
func print_channel(c chan int) (i int) {
for v := range c {
Printf("%v: %vn", i, v)
i++
}
return
}
73Going Loopy slideshare.net/feyeleanor
user-defined type
74Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
type Iterable interface {
Each(func(interface{}))
}
type IterableSlice[]int
func (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 := 0
iter.Each(func(v interface{}) {
Printf("%v: %vn", i, v)
i++
})
}
75Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
type Iterable interface {
Each(func(interface{}))
}
type IterableSlice[]int
func (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 := 0
iter.Each(func(v interface{}) {
Printf("%v: %vn", i, v)
i++
})
}
76Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
type Iterable interface {
Each(func(interface{}))
}
type IterableSlice[]int
func (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 := 0
iter.Each(func(v interface{}) {
Printf("%v: %vn", i, v)
i++
})
}
77Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
type Iterable interface {
Each(func(interface{}))
}
type IterableSlice []int
func (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 := 0
iter.Each(func(v interface{}) {
Printf("%v: %vn", i, v)
i++
})
}
78Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
type Iterable interface {
Each(func(interface{}))
}
type IterableSlice []int
func (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 := 0
iter.Each(func(v interface{}) {
Printf("%v: %vn", i, v)
i++
})
}
79Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
type Iterable interface {
Each(func(interface{}))
}
type IterableSlice []int
func (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 := 0
iter.Each(func(v interface{}) {
Printf("%v: %vn", i, v)
i++
})
}
80Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
type Iterable interface {
Each(func(interface{}))
}
type IterableSlice []int
func (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 := 0
iter.Each(func(v interface{}) {
Printf("%v: %vn", i, v)
i++
})
}
81Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
type Iterable interface {
Each(f func(int, interface{}))
}
type IterableSlice []int
func (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: %vn", i, v)
})
}
82Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
type Iterable interface {
Each(interface{})
}
type IterableSlice []int
func (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 := 0
s.Each(func(v interface{}) {
Printf("%v: %vn", i, v)
i++
})
s.Each(func(n int, v interface{}) {
Printf("%v: %vn", n, v)
})
}
83Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
type Iterable interface {
Each(interface{})
}
type IterableSlice []int
func (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 := 0
s.Each(func(v interface{}) {
Printf("%v: %vn", i, v)
i++
})
s.Each(func(n int, v interface{}) {
Printf("%v: %vn", n, v)
})
}
84Going Loopy slideshare.net/feyeleanor
package main
import . "fmt"
type Iterable interface {
Each(interface{})
}
type IterableSlice []int
func (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 := 0
s.Each(func(v interface{}) {
Printf("%v: %vn", i, v)
i++
})
s.Each(func(n int, v interface{}) {
Printf("%v: %vn", n, v)
})
}
85Going Loopy slideshare.net/feyeleanor
upon reflection
86Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s(i))
}
case []int:
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
}
87Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s(i))
}
case []int:
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
}
88Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s(i))
}
case []int:
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
}
89Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s(i))
}
case []int:
for i, v := range s {
Printf("%v: %vn", i, v)
}
}
}
90Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s.Call(p)[0].Interface())
}
case Slice:
for i := 0; i < s.Len(); i++ {
Printf("%v: %vn", i, s.Index(i).Interface())
}
}
}
91Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s.Call(p)[0].Interface())
}
case Slice:
for i := 0; i < s.Len(); i++ {
Printf("%v: %vn", i, s.Index(i).Interface())
}
}
}
92Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s.Call(p)[0].Interface())
}
case Slice:
for i := 0; i < s.Len(); i++ {
Printf("%v: %vn", i, s.Index(i).Interface())
}
}
}
93Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s.Call(p)[0].Interface())
}
case Slice:
for i := 0; i < s.Len(); i++ {
Printf("%v: %vn", i, s.Index(i).Interface())
}
}
}
94Going Loopy slideshare.net/feyeleanor
package main
import . "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: %vn", i, s.Call(p)[0].Interface())
}
case Slice:
for i := 0; i < s.Len(); i++ {
Printf("%v: %vn", i, s.Index(i).Interface())
}
}
}
95Going Loopy slideshare.net/feyeleanor
package main
import . "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 int
p := []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: %vn", i, v.Interface())
}
96Going Loopy slideshare.net/feyeleanor
package main
import . "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 int
p := []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: %vn", i, v.Interface())
}
97Going Loopy slideshare.net/feyeleanor
package main
import . "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 int
p := []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: %vn", i, v.Interface())
}
98Going Loopy slideshare.net/feyeleanor
package main
import . "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 int
p := []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: %vn", i, v.Interface())
}
99Going Loopy slideshare.net/feyeleanor
package main
import . "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 int
p := []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: %vn", i, v.Interface())
}
100Going Loopy slideshare.net/feyeleanor
package main
import . "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 int
p := []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: %vn", i, v.Interface())
}
101Going Loopy slideshare.net/feyeleanor
package main
import . "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 int
p := []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: %vn", i, v.Interface())
}
102Going Loopy slideshare.net/feyeleanor
package main
import . "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 int
p := []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: %vn", i, v.Interface())
}
103Going Loopy slideshare.net/feyeleanor
package main
import . "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 int
p := []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: %vn", 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

Going Loopy: Adventures in Iteration with Go

  • 1.
    going loopy adventures initeration with go e.mchugh@inidsol.uk Going Loopy slideshare.net/feyeleanor
  • 2.
    the conditional loop GoingLoopy slideshare.net/feyeleanor2
  • 3.
    package main import "fmt" funcmain() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { fmt.Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor3
  • 4.
    package main import "fmt" funcmain() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { fmt.Printf("%v: %vn", i, s[i]) } } 0: 0 1: 2 2: 4 3: 6 4: 8 Going Loopy slideshare.net/feyeleanor4
  • 5.
    package main import "fmt" funcmain() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { fmt.Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor5
  • 6.
    package main import "fmt" funcmain() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { fmt.Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor6
  • 7.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } 7Going Loopy slideshare.net/feyeleanor
  • 8.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } 8Going Loopy slideshare.net/feyeleanor
  • 9.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } 9Going Loopy slideshare.net/feyeleanor
  • 10.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor10
  • 11.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor11
  • 12.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor12
  • 13.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor13
  • 14.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor14
  • 15.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor15
  • 16.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } 16Going Loopy slideshare.net/feyeleanor
  • 17.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor17
  • 18.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor18
  • 19.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor19
  • 20.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i := 0; i < len(s); i++ { Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor20
  • 21.
    the infinite loop GoingLoopy slideshare.net/feyeleanor21
  • 22.
    package main import ."fmt" func main() { defer func() { recover() }() s := []int{0, 2, 4, 6, 8} var i int for { Printf("%v: %vn", i, s[i]) i++ } } Going Loopy slideshare.net/feyeleanor22
  • 23.
    package main import ."fmt" func main() { defer func() { recover() }() s := []int{0, 2, 4, 6, 8} var i int for { Printf("%v: %vn", i, s[i]) i++ } } Going Loopy slideshare.net/feyeleanor23
  • 24.
    package main import ."fmt" func main() { defer func() { recover() }() s := []int{0, 2, 4, 6, 8} var i int for { Printf("%v: %vn", i, s[i]) i++ } } Going Loopy slideshare.net/feyeleanor24
  • 25.
    package main import ."fmt" func main() { defer func() { recover() }() s := []int{0, 2, 4, 6, 8} var i int for { Printf("%v: %vn", i, s[i]) i++ } } Going Loopy slideshare.net/feyeleanor25
  • 26.
    package main import ."fmt" func main() { defer func() { recover() }() s := []int{0, 2, 4, 6, 8} var i int for { Printf("%v: %vn", i, s[i]) i++ } } Going Loopy slideshare.net/feyeleanor26
  • 27.
    package main import ."fmt" func main() { defer func() { recover() }() s := []int{0, 2, 4, 6, 8} var i int for { Printf("%v: %vn", i, s[i]) i++ } } Going Loopy slideshare.net/feyeleanor27
  • 28.
    package main import ."fmt" func main() { defer func() { recover() }() s := []int{0, 2, 4, 6, 8} for i := 0; ; i++ { Printf("%v: %vn", i, s[i]) } } Going Loopy slideshare.net/feyeleanor28
  • 29.
    the range Going Loopyslideshare.net/feyeleanor29
  • 30.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i, v := range s { Printf("%v: %vn", i, v) } } Going Loopy slideshare.net/feyeleanor30
  • 31.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i, v := range s { Printf("%v: %vn", i, v) } } Going Loopy slideshare.net/feyeleanor31
  • 32.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i, v := range s { Printf("%v: %vn", i, v) } } Going Loopy slideshare.net/feyeleanor32
  • 33.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i, v := range s { Printf("%v: %vn", i, v) } } Going Loopy slideshare.net/feyeleanor33
  • 34.
    package main import ."fmt" func main() { s := []int{0, 2, 4, 6, 8} for i, v := range s { Printf("%v: %vn", i, v) } } Going Loopy slideshare.net/feyeleanor34
  • 35.
    a functional interlude 35GoingLoopy slideshare.net/feyeleanor
  • 36.
    package main import ."fmt" func main() { print_slice([]int{0, 2, 4, 6, 8}) } func print_slice(s []int) { for i, v := range s { Printf("%v: %vn", i, v) } } 36Going Loopy slideshare.net/feyeleanor
  • 37.
    package main import ."fmt" func main() { print_slice([]int{0, 2, 4, 6, 8}) } func print_slice(s []int) { for i, v := range s { Printf("%v: %vn", i, v) } } 37Going Loopy slideshare.net/feyeleanor
  • 38.
    package main import ."fmt" func main() { print_slice([]int{0, 2, 4, 6, 8}) } func print_slice(s []int) { for i, v := range s { Printf("%v: %vn", i, v) } } 38Going Loopy slideshare.net/feyeleanor
  • 39.
    package main import ."fmt" func main() { print_slice([]int{0, 2, 4, 6, 8}) } func print_slice(s []int) { for i, v := range s { Printf("%v: %vn", i, v) } } 39Going Loopy slideshare.net/feyeleanor
  • 40.
    package main import ."fmt" func main() { print_slice(0, 2, 4, 6, 8) } func print_slice(s ...int) { for i, v := range s { Printf("%v: %vn", i, v) } } 40Going Loopy slideshare.net/feyeleanor
  • 41.
    package main import ."fmt" func main() { print_slice(0, 2, 4, 6, 8) } func print_slice(s ...int) { for i, v := range s { Printf("%v: %vn", i, v) } } 41Going Loopy slideshare.net/feyeleanor
  • 42.
    asserting type Going Loopyslideshare.net/feyeleanor42
  • 43.
    package main import ."fmt" func main() { print_slice([]int{0, 2, 4, 6, 8}) } func print_slice(s interface{}) { for i, v := range s.([]int) { Printf("%v: %vn", i, v) } } Going Loopy slideshare.net/feyeleanor43
  • 44.
    package main import ."fmt" func main() { print_slice([]int{0, 2, 4, 6, 8}) } func print_slice(s interface{}) { for i, v := range s.([]int) { Printf("%v: %vn", i, v) } } Going Loopy slideshare.net/feyeleanor44
  • 45.
    package main import ."fmt" func main() { print_slice([]int{0, 2, 4, 6, 8}) } func print_slice(s interface{}) { for i, v := range s.([]int) { Printf("%v: %vn", i, v) } } Going Loopy slideshare.net/feyeleanor45
  • 46.
    package main import ."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: %vn", i, v) } } } Going Loopy slideshare.net/feyeleanor46
  • 47.
    package main import ."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: %vn", i, v) } } } Going Loopy slideshare.net/feyeleanor47
  • 48.
    package main import ."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: %vn", i, v) } } } Going Loopy slideshare.net/feyeleanor48
  • 49.
    package main import ."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: %vn", i, v) } } } Going Loopy slideshare.net/feyeleanor49
  • 50.
    package main import ."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: %vn", i, v) } } } Going Loopy slideshare.net/feyeleanor50
  • 51.
    package main import ."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: %vn", i, v) } } } Going Loopy slideshare.net/feyeleanor51
  • 52.
    package main import ."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: %vn", i, v) } } } Going Loopy slideshare.net/feyeleanor52
  • 53.
    package main import ."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: %vn", i, v) } } } Going Loopy slideshare.net/feyeleanor53
  • 54.
  • 55.
    package main import ."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: %vn", i, s(i)) } } } 55Going Loopy slideshare.net/feyeleanor
  • 56.
    package main import ."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: %vn", i, s(i)) } } } 56Going Loopy slideshare.net/feyeleanor
  • 57.
    package main import ."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: %vn", i, s(i)) } } } 57Going Loopy slideshare.net/feyeleanor
  • 58.
    package main import ."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: %vn", i, s(i)) } } } 58Going Loopy slideshare.net/feyeleanor
  • 59.
    package main import ."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: %vn", i, s(i)) } } } 59Going Loopy slideshare.net/feyeleanor
  • 60.
    package main import ."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: %vn", i, s(i)) } } } 60Going Loopy slideshare.net/feyeleanor
  • 61.
    package main import ."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: %vn", i, s(i)) } } } 61Going Loopy slideshare.net/feyeleanor
  • 62.
    package main import ."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: %vn", i, s(i)) } } } 62Going Loopy slideshare.net/feyeleanor
  • 63.
  • 64.
    package main import ."fmt" func main() { c := make(chan int) go func() { for _, v := range []int{0, 2, 4, 6, 8} { c <- v } close(c) }() Printf("elements: %vn", print_channel(c)) } func print_channel(c chan int) (i int) { for v := range c { Printf("%v: %vn", i, v) i++ } return } 64Going Loopy slideshare.net/feyeleanor
  • 65.
    package main import ."fmt" func main() { c := make(chan int) go func() { for _, v := range []int{0, 2, 4, 6, 8} { c <- v } close(c) }() Printf("elements: %vn", print_channel(c)) } func print_channel(c chan int) (i int) { for v := range c { Printf("%v: %vn", i, v) i++ } return } 65Going Loopy slideshare.net/feyeleanor
  • 66.
    package main import ."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: %vn", print_channel(c)) } func print_channel(c chan int) (i int) { for v := range c { Printf("%v: %vn", i, v) i++ } return } 66Going Loopy slideshare.net/feyeleanor
  • 67.
    package main import ."fmt" func main() { c := make(chan int) go func() { for _, v := range []int{0, 2, 4, 6, 8} { c <- v } close(c) }() Printf("elements: %vn", print_channel(c)) } func print_channel(c chan int) (i int) { for v := range c { Printf("%v: %vn", i, v) i++ } return } 67Going Loopy slideshare.net/feyeleanor
  • 68.
    package main import ."fmt" func main() { c := make(chan int) go func() { for _, v := range []int{0, 2, 4, 6, 8} { c <- v } close(c) }() Printf("elements: %vn", print_channel(c)) } func print_channel(c chan int) (i int) { for v := range c { Printf("%v: %vn", i, v) i++ } return } 68Going Loopy slideshare.net/feyeleanor
  • 69.
    package main import ."fmt" func main() { c := make(chan int) go func() { for _, v := range []int{0, 2, 4, 6, 8} { c <- v } close(c) }() Printf("elements: %vn", print_channel(c)) } func print_channel(c chan int) (i int) { for v := range c { Printf("%v: %vn", i, v) i++ } return } 69Going Loopy slideshare.net/feyeleanor
  • 70.
    package main import ."fmt" func main() { c := make(chan int) go func() { for _, v := range []int{0, 2, 4, 6, 8} { c <- v } close(c) }() Printf("elements: %vn", print_channel(c)) } func print_channel(c chan int) (i int) { for v := range c { Printf("%v: %vn", i, v) i++ } return } 70Going Loopy slideshare.net/feyeleanor
  • 71.
    package main import ."fmt" func main() { c := make(chan int) go func() { for _, v := range []int{0, 2, 4, 6, 8} { c <- v } close(c) }() Printf("elements: %vn", print_channel(c)) } func print_channel(c chan int) (i int) { for v := range c { Printf("%v: %vn", i, v) i++ } return } 71Going Loopy slideshare.net/feyeleanor
  • 72.
    package main import ."fmt" func main() { c := make(chan int) go func() { for _, v := range []int{0, 2, 4, 6, 8} { c <- v } close(c) }() Printf("elements: %vn", print_channel(c)) } func print_channel(c chan int) (i int) { for v := range c { Printf("%v: %vn", i, v) i++ } return } 72Going Loopy slideshare.net/feyeleanor
  • 73.
    package main import ."fmt" func main() { c := make(chan int) go func() { for _, v := range []int{0, 2, 4, 6, 8} { c <- v } close(c) }() Printf("elements: %vn", print_channel(c)) } func print_channel(c chan int) (i int) { for v := range c { Printf("%v: %vn", i, v) i++ } return } 73Going Loopy slideshare.net/feyeleanor
  • 74.
    user-defined type 74Going Loopyslideshare.net/feyeleanor
  • 75.
    package main import ."fmt" type Iterable interface { Each(func(interface{})) } type IterableSlice[]int func (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 := 0 iter.Each(func(v interface{}) { Printf("%v: %vn", i, v) i++ }) } 75Going Loopy slideshare.net/feyeleanor
  • 76.
    package main import ."fmt" type Iterable interface { Each(func(interface{})) } type IterableSlice[]int func (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 := 0 iter.Each(func(v interface{}) { Printf("%v: %vn", i, v) i++ }) } 76Going Loopy slideshare.net/feyeleanor
  • 77.
    package main import ."fmt" type Iterable interface { Each(func(interface{})) } type IterableSlice[]int func (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 := 0 iter.Each(func(v interface{}) { Printf("%v: %vn", i, v) i++ }) } 77Going Loopy slideshare.net/feyeleanor
  • 78.
    package main import ."fmt" type Iterable interface { Each(func(interface{})) } type IterableSlice []int func (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 := 0 iter.Each(func(v interface{}) { Printf("%v: %vn", i, v) i++ }) } 78Going Loopy slideshare.net/feyeleanor
  • 79.
    package main import ."fmt" type Iterable interface { Each(func(interface{})) } type IterableSlice []int func (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 := 0 iter.Each(func(v interface{}) { Printf("%v: %vn", i, v) i++ }) } 79Going Loopy slideshare.net/feyeleanor
  • 80.
    package main import ."fmt" type Iterable interface { Each(func(interface{})) } type IterableSlice []int func (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 := 0 iter.Each(func(v interface{}) { Printf("%v: %vn", i, v) i++ }) } 80Going Loopy slideshare.net/feyeleanor
  • 81.
    package main import ."fmt" type Iterable interface { Each(func(interface{})) } type IterableSlice []int func (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 := 0 iter.Each(func(v interface{}) { Printf("%v: %vn", i, v) i++ }) } 81Going Loopy slideshare.net/feyeleanor
  • 82.
    package main import ."fmt" type Iterable interface { Each(f func(int, interface{})) } type IterableSlice []int func (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: %vn", i, v) }) } 82Going Loopy slideshare.net/feyeleanor
  • 83.
    package main import ."fmt" type Iterable interface { Each(interface{}) } type IterableSlice []int func (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 := 0 s.Each(func(v interface{}) { Printf("%v: %vn", i, v) i++ }) s.Each(func(n int, v interface{}) { Printf("%v: %vn", n, v) }) } 83Going Loopy slideshare.net/feyeleanor
  • 84.
    package main import ."fmt" type Iterable interface { Each(interface{}) } type IterableSlice []int func (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 := 0 s.Each(func(v interface{}) { Printf("%v: %vn", i, v) i++ }) s.Each(func(n int, v interface{}) { Printf("%v: %vn", n, v) }) } 84Going Loopy slideshare.net/feyeleanor
  • 85.
    package main import ."fmt" type Iterable interface { Each(interface{}) } type IterableSlice []int func (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 := 0 s.Each(func(v interface{}) { Printf("%v: %vn", i, v) i++ }) s.Each(func(n int, v interface{}) { Printf("%v: %vn", n, v) }) } 85Going Loopy slideshare.net/feyeleanor
  • 86.
    upon reflection 86Going Loopyslideshare.net/feyeleanor
  • 87.
    package main import ."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: %vn", i, s(i)) } case []int: for i, v := range s { Printf("%v: %vn", i, v) } } } 87Going Loopy slideshare.net/feyeleanor
  • 88.
    package main import ."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: %vn", i, s(i)) } case []int: for i, v := range s { Printf("%v: %vn", i, v) } } } 88Going Loopy slideshare.net/feyeleanor
  • 89.
    package main import ."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: %vn", i, s(i)) } case []int: for i, v := range s { Printf("%v: %vn", i, v) } } } 89Going Loopy slideshare.net/feyeleanor
  • 90.
    package main import ."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: %vn", i, s(i)) } case []int: for i, v := range s { Printf("%v: %vn", i, v) } } } 90Going Loopy slideshare.net/feyeleanor
  • 91.
    package main import ."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: %vn", i, s.Call(p)[0].Interface()) } case Slice: for i := 0; i < s.Len(); i++ { Printf("%v: %vn", i, s.Index(i).Interface()) } } } 91Going Loopy slideshare.net/feyeleanor
  • 92.
    package main import ."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: %vn", i, s.Call(p)[0].Interface()) } case Slice: for i := 0; i < s.Len(); i++ { Printf("%v: %vn", i, s.Index(i).Interface()) } } } 92Going Loopy slideshare.net/feyeleanor
  • 93.
    package main import ."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: %vn", i, s.Call(p)[0].Interface()) } case Slice: for i := 0; i < s.Len(); i++ { Printf("%v: %vn", i, s.Index(i).Interface()) } } } 93Going Loopy slideshare.net/feyeleanor
  • 94.
    package main import ."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: %vn", i, s.Call(p)[0].Interface()) } case Slice: for i := 0; i < s.Len(); i++ { Printf("%v: %vn", i, s.Index(i).Interface()) } } } 94Going Loopy slideshare.net/feyeleanor
  • 95.
    package main import ."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: %vn", i, s.Call(p)[0].Interface()) } case Slice: for i := 0; i < s.Len(); i++ { Printf("%v: %vn", i, s.Index(i).Interface()) } } } 95Going Loopy slideshare.net/feyeleanor
  • 96.
    package main import ."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 int p := []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: %vn", i, v.Interface()) } 96Going Loopy slideshare.net/feyeleanor
  • 97.
    package main import ."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 int p := []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: %vn", i, v.Interface()) } 97Going Loopy slideshare.net/feyeleanor
  • 98.
    package main import ."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 int p := []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: %vn", i, v.Interface()) } 98Going Loopy slideshare.net/feyeleanor
  • 99.
    package main import ."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 int p := []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: %vn", i, v.Interface()) } 99Going Loopy slideshare.net/feyeleanor
  • 100.
    package main import ."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 int p := []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: %vn", i, v.Interface()) } 100Going Loopy slideshare.net/feyeleanor
  • 101.
    package main import ."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 int p := []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: %vn", i, v.Interface()) } 101Going Loopy slideshare.net/feyeleanor
  • 102.
    package main import ."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 int p := []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: %vn", i, v.Interface()) } 102Going Loopy slideshare.net/feyeleanor
  • 103.
    package main import ."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 int p := []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: %vn", i, v.Interface()) } 103Going Loopy slideshare.net/feyeleanor
  • 104.
    package main import ."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 int p := []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: %vn", i, v.Interface()) } 104Going Loopy slideshare.net/feyeleanor
  • 105.
    you now knowgo Going Loopy 112 slideshare.net/feyeleanor
  • 106.
    #golang Going Loopy 113slideshare.net/feyeleanor
  • 107.
    http://golang.org/ Going Loopy 114slideshare.net/feyeleanor