SlideShare a Scribd company logo
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

More Related Content

PDF
Go for the paranoid network programmer, 2nd edition
PDF
Implementing Virtual Machines in Go & C
PDF
Hello Go
PDF
Going Loopy - Adventures in Iteration with Google Go
PDF
10〜30分で何となく分かるGo
PDF
Go for the paranoid network programmer, 3rd edition
KEY
Going Loopy
PDF
An introduction to functional programming with go
Go for the paranoid network programmer, 2nd edition
Implementing Virtual Machines in Go & C
Hello Go
Going Loopy - Adventures in Iteration with Google Go
10〜30分で何となく分かるGo
Go for the paranoid network programmer, 3rd edition
Going Loopy
An introduction to functional programming with go

What's hot (19)

PDF
Implementing virtual machines in go & c 2018 redux
PDF
The Browser Environment - A Systems Programmer's Perspective
PDF
Let's golang
PDF
Testing CLI tools with Go
DOCX
Data structures
PDF
EuroPython 2015 - Decorators demystified
PDF
Are we ready to Go?
PDF
Using Flow-based programming to write tools and workflows for Scientific Comp...
PDF
Map struct
PPTX
북스터디 디스커버리 Go 언어
PDF
Data Pipelines in Swift
PPTX
Dts x dicoding #2 memulai pemrograman kotlin
KEY
PDF
Java VS Python
PDF
Geeks Anonymes - Le langage Go
KEY
Why Learn Python?
PDF
Python Performance 101
PDF
Introduction to Go for Java Programmers
PPTX
Load-time Hacking using LD_PRELOAD
Implementing virtual machines in go & c 2018 redux
The Browser Environment - A Systems Programmer's Perspective
Let's golang
Testing CLI tools with Go
Data structures
EuroPython 2015 - Decorators demystified
Are we ready to Go?
Using Flow-based programming to write tools and workflows for Scientific Comp...
Map struct
북스터디 디스커버리 Go 언어
Data Pipelines in Swift
Dts x dicoding #2 memulai pemrograman kotlin
Java VS Python
Geeks Anonymes - Le langage Go
Why Learn Python?
Python Performance 101
Introduction to Go for Java Programmers
Load-time Hacking using LD_PRELOAD
Ad

Similar to Going Loopy: Adventures in Iteration with Go (20)

PDF
going loopy - adventures in iteration with google go
PDF
Generics, Reflection, and Efficient Collections
KEY
関数潮流(Function Tendency)
PDF
Y - Recursion The Hard Way GopherCon EU 2025
PPT
Array strings
PDF
Implementing Software Machines in Go and C
ODP
Pick up the low-hanging concurrency fruit
PDF
Go ahead, make my day
PPTX
Awt components
PPTX
Golang basics for Java developers - Part 1
PDF
Advanced Debugging Using Java Bytecodes
PDF
PPT
Unit 5 Foc
DOCX
PDF
Go: It's Not Just For Google
PDF
Assignment on Numerical Method C Code
PPT
lets play with "c"..!!! :):)
PDF
Functional programming basics
PPTX
ภาษาซีพื้นฐาน
going loopy - adventures in iteration with google go
Generics, Reflection, and Efficient Collections
関数潮流(Function Tendency)
Y - Recursion The Hard Way GopherCon EU 2025
Array strings
Implementing Software Machines in Go and C
Pick up the low-hanging concurrency fruit
Go ahead, make my day
Awt components
Golang basics for Java developers - Part 1
Advanced Debugging Using Java Bytecodes
Unit 5 Foc
Go: It's Not Just For Google
Assignment on Numerical Method C Code
lets play with "c"..!!! :):)
Functional programming basics
ภาษาซีพื้นฐาน
Ad

More from Eleanor McHugh (19)

PDF
Go for the Paranoid Network Programmer, 2025 Edition
PDF
Never Say, Never Say Die! - the art of low-level Ruby and other Macabre Tales
PDF
[2024] An Introduction to Functional Programming with Go [Y Combinator Remix]...
PDF
[2023] Putting the R! in R&D.pdf
PDF
The Relevance of Liveness - Biometrics and Data Integrity
PDF
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
PDF
An introduction to functional programming with Go [redux]
PDF
Identity & trust in Monitored Spaces
PDF
Don't Ask, Don't Tell - The Virtues of Privacy By Design
PDF
Don't ask, don't tell the virtues of privacy by design
PDF
Anonymity, identity, trust
PDF
Distributed Ledgers: Anonymity & Immutability at Scale
PDF
Finding a useful outlet for my many Adventures in go
PDF
Anonymity, trust, accountability
PDF
Implementing Virtual Machines in Ruby & C
PDF
Implementing Software Machines in C and Go
PDF
Encrypt all transports
PDF
Whispered secrets
PDF
Whispered secrets
Go for the Paranoid Network Programmer, 2025 Edition
Never Say, Never Say Die! - the art of low-level Ruby and other Macabre Tales
[2024] An Introduction to Functional Programming with Go [Y Combinator Remix]...
[2023] Putting the R! in R&D.pdf
The Relevance of Liveness - Biometrics and Data Integrity
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
An introduction to functional programming with Go [redux]
Identity & trust in Monitored Spaces
Don't Ask, Don't Tell - The Virtues of Privacy By Design
Don't ask, don't tell the virtues of privacy by design
Anonymity, identity, trust
Distributed Ledgers: Anonymity & Immutability at Scale
Finding a useful outlet for my many Adventures in go
Anonymity, trust, accountability
Implementing Virtual Machines in Ruby & C
Implementing Software Machines in C and Go
Encrypt all transports
Whispered secrets
Whispered secrets

Recently uploaded (20)

PDF
Digital Systems & Binary Numbers (comprehensive )
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PPTX
Oracle Fusion HCM Cloud Demo for Beginners
PDF
Salesforce Agentforce AI Implementation.pdf
PDF
iTop VPN Free 5.6.0.5262 Crack latest version 2025
PDF
Complete Guide to Website Development in Malaysia for SMEs
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
Nekopoi APK 2025 free lastest update
PDF
Cost to Outsource Software Development in 2025
PDF
How AI/LLM recommend to you ? GDG meetup 16 Aug by Fariman Guliev
PPTX
Embracing Complexity in Serverless! GOTO Serverless Bengaluru
PPTX
Operating system designcfffgfgggggggvggggggggg
PPTX
WiFi Honeypot Detecscfddssdffsedfseztor.pptx
PDF
CapCut Video Editor 6.8.1 Crack for PC Latest Download (Fully Activated) 2025
PDF
Designing Intelligence for the Shop Floor.pdf
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
DOCX
Greta — No-Code AI for Building Full-Stack Web & Mobile Apps
PPTX
Why Generative AI is the Future of Content, Code & Creativity?
PPTX
CHAPTER 2 - PM Management and IT Context
Digital Systems & Binary Numbers (comprehensive )
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Oracle Fusion HCM Cloud Demo for Beginners
Salesforce Agentforce AI Implementation.pdf
iTop VPN Free 5.6.0.5262 Crack latest version 2025
Complete Guide to Website Development in Malaysia for SMEs
wealthsignaloriginal-com-DS-text-... (1).pdf
Nekopoi APK 2025 free lastest update
Cost to Outsource Software Development in 2025
How AI/LLM recommend to you ? GDG meetup 16 Aug by Fariman Guliev
Embracing Complexity in Serverless! GOTO Serverless Bengaluru
Operating system designcfffgfgggggggvggggggggg
WiFi Honeypot Detecscfddssdffsedfseztor.pptx
CapCut Video Editor 6.8.1 Crack for PC Latest Download (Fully Activated) 2025
Designing Intelligence for the Shop Floor.pdf
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
Navsoft: AI-Powered Business Solutions & Custom Software Development
Greta — No-Code AI for Building Full-Stack Web & Mobile Apps
Why Generative AI is the Future of Content, Code & Creativity?
CHAPTER 2 - PM Management and IT Context

Going Loopy: Adventures in Iteration with Go

  • 1. going loopy adventures in iteration with go e.mchugh@inidsol.uk Going Loopy slideshare.net/feyeleanor
  • 2. the conditional loop Going Loopy slideshare.net/feyeleanor2
  • 3. 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
  • 4. 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
  • 5. 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
  • 6. 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
  • 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 Going Loopy 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 Loopy slideshare.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 35Going Loopy 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 Loopy slideshare.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
  • 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
  • 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 Loopy slideshare.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 Loopy slideshare.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 know go Going Loopy 112 slideshare.net/feyeleanor
  • 106. #golang Going Loopy 113 slideshare.net/feyeleanor