SlideShare a Scribd company logo
Go <=> Ruby
 a selection of odd lightning talks



            @feyeleanor

http://slides.games-with-brains.net/
The Wild-Eyed
  Screamer
@feyeleanor
realtime
@feyeleanor
realtime

net working
@feyeleanor
realtime

net working

unix
@feyeleanor
realtime

net working

unix

languages
@feyeleanor
realtime

net working

unix

languages

virtual machines
Hacker 101
this presentation contains code
Hacker 101
this presentation contains code
that code is probably broken
Hacker 101
this presentation contains code
that code is probably broken
if this bothers you - fix it
Hacker 101
this presentation contains code
that code is probably broken
if this bothers you - fix it
it’s called a learning experience
Hacker 101
this presentation contains code
that code is probably broken
if this bothers you - fix it
it’s called a learning experience
and will make you a better persontm
Google Go
it’s not just for Google
meet Gordon
he’s a gopher
of very few words
who lives at google
package main

import "fmt"

const HELLO string = "hello"
var WORLD string = "world"

func main() {
	    fmt.Println(HELLO, WORLD)
}
package main

import "fmt"

const HELLO string = "hello"
var WORLD string = "world"

func main() {
	    fmt.Println(HELLO, WORLD)
}
package main

import "fmt"

const HELLO string = "hello"
var WORLD string = "world"

func main() {
	    fmt.Println(HELLO, WORLD)
}
package main

import "fmt"

const HELLO string = "hello"
var WORLD string = "world"

func main() {
	    fmt.Println(HELLO, WORLD)
}
package
organisation                    import

                           var, const, type
declaration
                 func, interface, map, struct, chan


                                if ... else
               switch ... case ... fallthrough ... default
                             select ... case
control flow                         for
                              for ... range
                           break, continue
                        go, goto, defer, return
boolean, numeric, array

  value
                    structure, interface



reference    pointer, slice, string, map, channel



invocation       function, method, closure
Go                       Ruby

compilation        static AOT            runtime mutable

 memory                     garbage collected

  syntax           minimalist               humanistic

                            strong dynamic
   type
                   embedding               inheritance

 dispatch     procedural invocation      message passing

semantics         statements               expressions
Ruby typing is tricksy
    lies we tell ourself about type
superclass   modules



class        modules


                   message
        instance
superclass   modules



         class        modules


type asserted
                 instance
instance               inherited
  class                  class

           expressed
             type




           modules
instance               inherited
  class                  class

           expressed
             type




           modules
instance               inherited
  class                  class

           expressed
             type




           modules
instance               inherited
  class                  class

           expressed
             type




           modules
class Counter
	    attr_writer	   :count

	    def initialize
	    	    @count = 0
	    end

	   def Tick
	   	    @count += 1
	   end
end

class DoubleCounter < Counter
	    def Tick
	    	    super
	    	    @count += 1
	    end
end

n = new(DoubleCounter)
puts n.Tick
puts n.superclass.Tick
class Counter
	    attr_writer	   :count

	    def initialize
	    	    @count = 0
	    end

	   def Tick
	   	    @count += 1
	   end
end

class DoubleCounter < Counter
	    def Tick
	    	    super
	    	    @count += 1
	    end
end

n = new(DoubleCounter)
puts n.Tick
puts n.superclass.Tick
class Counter
	    attr_writer	   :count

	    def initialize
	    	    @count = 0
	    end

	   def Tick
	   	    @count += 1
	   end
end

class DoubleCounter < Counter
	    def Tick
	    	    super
	    	    @count += 1
	    end
end

n = new(DoubleCounter)
puts n.Tick
puts n.superclass.Tick
class Counter
	    attr_writer	   :count

	    def initialize
	    	    @count = 0
	    end

	   def Tick
	   	    @count += 1
	   end
end

class DoubleCounter < Counter
	    def Tick
	    	    super
	    	    @count += 1
	    end
end

n = new(DoubleCounter)
puts n.Tick
puts n.superclass.Tick
class Counter
	    attr_writer	   :count

	    def initialize
	    	    @count = 0
	    end

	   def Tick
	   	    @count += 1
	   end
end

class DoubleCounter < Counter
	    def Tick
	    	    super
	    	    @count += 1
	    end
end

n = new(DoubleCounter)
puts n.Tick
puts n.superclass.Tick
class Counter
	    attr_writer	   :count

	    def initialize
	    	    @count = 0
	    end

	   def Tick
	   	    @count += 1
	   end
end

class DoubleCounter < Counter
	    def Tick
	    	    super
	    	    @count += 1
	    end
end

n = new(DoubleCounter)
puts n.Tick
puts n.superclass.Tick
down a rabbit hole
instances are their own classes
down a rabbit hole
instances are their own classes
and all classes are mutable at runtime
down a rabbit hole
instances are their own classes
all classes are mutable at runtime
so inheritance pathways can be altered
down a rabbit hole
instances are their own classes
and all classes are mutable at runtime
so inheritance pathways can be altered
making Ruby very flexible
down a rabbit hole
instances are their own classes
and all classes are mutable at runtime
so inheritance pathways can be altered
making Ruby very flexible
at the cost of type uncertainty
down a rabbit hole
instances are their own classes
and all classes are mutable at runtime
so inheritance pathways can be altered
making Ruby very flexible
at the cost of type uncertainty
which really bugs computer scientists
type in Go is                safetm
clearly defined areas of doubt and uncertainty
memory               method
 layout               set

           static
            type




          embedded
           types
memory               method
 layout               set

           static
            type




          embedded
           types
memory               method
 layout               set

           static
            type




          embedded
           types
memory               method
 layout               set

           static
            type




          embedded
           types
package Integer

type Int int

func (i *Int) Add(x int) {
	    *i += Int(x)
}
package Integer

type Int int

func (i *Int) Add(x int) {
	    *i += Int(x)
}
package Integer

type Int int

func (i *Int) Add(x int) {
	    *i += Int(x)
}
package Integer

type Int int

func (i *Int) Add(x int) {
	    *i += Int(x)
}
type Buffer []Int

func (b Buffer) Swap(i, j int) {
	    b[i], b[j] = b[j], b[i]
}

func (b Buffer) Clone() Buffer {
	    s := make(Buffer, len(b))
	    copy(s, b)
	    return s
}

func (b Buffer) Move(i, n int) {
	    if n > len(b) - i {
	    	     n = len(b) - i
	    }
	    segment_to_move := b[:i].Clone()
	    copy(b, b[i:i + n])
	    copy(b[n:i + n], segment_to_move)
}
type Buffer []Int

func (b Buffer) Swap(i, j int) {
	    b[i], b[j] = b[j], b[i]
}

func (b Buffer) Clone() Buffer {
	    s := make(Buffer, len(b))
	    copy(s, b)
	    return s
}

func (b Buffer) Move(i, n int) {
	    if n > len(b) - i {
	    	     n = len(b) - i
	    }
	    segment_to_move := b[:i].Clone()
	    copy(b, b[i:i + n])
	    copy(b[n:i + n], segment_to_move)
}
type Buffer []Int

func (b Buffer) Swap(i, j int) {
	    b[i], b[j] = b[j], b[i]
}

func (b Buffer) Clone() Buffer {
	    s := make(Buffer, len(b))
	    copy(s, b)
	    return s
}

func (b Buffer) Move(i, n int) {
	    if n > len(b) - i {
	    	     n = len(b) - i
	    }
	    segment_to_move := b[:i].Clone()
	    copy(b, b[i:i + n])
	    copy(b[n:i + n], segment_to_move)
}
package main

import "fmt"
import "Integer"

func main() {
	    i := Integer.Buffer{0, 1, 2, 3, 4, 5}
	    b := i.Clone()
	    b.Swap(1, 2)
	    b.Move(3, 2)
	    b[0].Add(3)                             produces:
	    fmt.Printf("b[0:2] = %vn", b[:2])         b[0:2] = [6 4]
}
package main

import "fmt"
import "Integer"

func main() {
	    i := Integer.Buffer{0, 1, 2, 3, 4, 5}
	    b := i.Clone()
	    b.Swap(1, 2)
	    b.Move(3, 2)
	    b[0].Add(3)                             produces:

    fmt.Printf(“b[0:2] = %vn”, b[:2])         b[0:2] = [6 4]
}
package main

import "fmt"
import "Integer"

func main() {
	    i := Integer.Buffer{0, 1, 2, 3, 4, 5}
	    b := i.Clone()
	    b.Swap(1, 2)
	    b.Move(3, 2)
	    b[0].Add(3)                             produces:
	    fmt.Printf("b[0:2] = %vn", b[:2])         b[0:2] = [6 4]
}
package main

import "fmt"
import "Integer"

func main() {
	    i := Integer.Buffer{0, 1, 2, 3, 4, 5}
	    b := i.Clone()
	    b.Swap(1, 2)
	    b.Move(3, 2)
	    b[0].Add(3)                             produces:
	    fmt.Printf("b[0:2] = %vn", b[:2])         b[0:2] = [6 4]
}
package main

import "fmt"
import "Integer"

func main() {
	    i := Integer.Buffer{0, 1, 2, 3, 4, 5}
	    b := i.Clone()
	    b.Swap(1, 2)
	    b.Move(3, 2)
	    b[0].Add(3)                             produces:
	    fmt.Printf("b[0:2] = %vn", b[:2])         b[0:2] = [6 4]
}
package Vector
import . "Integer"

type Vector struct {
	    Buffer
}

func (v *Vector) Clone() *Vector {
	    return &Vector{v.Buffer.Clone()}
}

func (v *Vector) Slice(i, j int) Buffer {
	    return v.Buffer[i:j]
}
package Vector
import . "Integer"

type Vector struct {
	    Buffer
}

func (v *Vector) Clone() *Vector {
	    return &Vector{v.Buffer.Clone()}
}

func (v *Vector) Slice(i, j int) Buffer {
	    return v.Buffer[i:j]
}
package Vector
import . "Integer"

type Vector struct {
	    Buffer
}

func (v *Vector) Clone() *Vector {
	    return &Vector{v.Buffer.Clone()}
}

func (v *Vector) Slice(i, j int) Buffer {
	    return v.Buffer[i:j]
}
package Vector
import . "Integer"

type Vector struct {
	    Buffer
}

func (v *Vector) Clone() *Vector {
	    return &Vector{v.Buffer.Clone()}
}

func (v *Vector) Slice(i, j int) Buffer {
	    return v.Buffer[i:j]
}
package Vector
import . "Integer"

type Vector struct {
	    Buffer
}

func (v *Vector) Clone() *Vector {
	    return &Vector{v.Buffer.Clone()}
}

func (v *Vector) Slice(i, j int) Buffer {
	    return v.Buffer[i:j]
}
type Adder interface {
	    Add(j int)
	    Subtract(j int)
	    Result() interface{}
	    Reset()
}
type Adder interface {
	    Add(j int)
	    Subtract(j int)
	    Result() interface{}
	    Reset()
}
type Adder interface {
	    Add(j int)
	    Subtract(j int)
	    Result() interface{}
	    Reset()
}
type IAdder int

func (i IAdder) Add(j int) {
	    i[0] += i[j]
}

func (i IAdder) Subtract(j int) {
	    i[0] -= i[j]
}

func (i IAdder) Result() interface{} {
	    return i[0]
}

func (i IAdder) Reset() {
	    i[0] = *new(int)
}

func (i IAdder) Increment() {
	    i[0]++
}
type IAdder int

func (i IAdder) Add(j int) {
	    i[0] += i[j]
}

func (i IAdder) Subtract(j int) {
	    i[0] -= i[j]
}

func (i IAdder) Result() interface{} {
	    return i[0]
}

func (i IAdder) Reset() {
	    i[0] = *new(int)
}

func (i IAdder) Increment() {
	    i[0]++
}
type IAdder int

func (i IAdder) Add(j int) {
	    i[0] += i[j]
}

func (i IAdder) Subtract(j int) {
	    i[0] -= i[j]
}

func (i IAdder) Result() interface{} {
	    return i[0]
}

func (i IAdder) Reset() {
	    i[0] = *new(int)
}

func (i IAdder) Increment() {
	    i[0]++
}
type FAdder []float32

func (f FAdder) Add(j int) {
	    f[0] += f[j]
}

func (f FAdder) Subtract(j int) {
	    f[0] -= f[j]
}

func (f FAdder) Result() interface{} {
	    return f[0]
}

func (f FAdder) Reset() {
	    f[0] = 0
}
type FAdder []float32

func (f FAdder) Add(j int) {
	    f[0] += f[j]
}

func (f FAdder) Subtract(j int) {
	    f[0] -= f[j]
}

func (f FAdder) Result() interface{} {
	    return f[0]
}

func (f FAdder) Reset() {
	    f[0] = 0
}
type FAdder []float32

func (f FAdder) Add(j int) {
	    f[0] += f[j]
}

func (f FAdder) Subtract(j int) {
	    f[0] -= f[j]
}

func (f FAdder) Result() interface{} {
	    return f[0]
}

func (f FAdder) Reset() {
	    f[0] = 0
}
func TestAdder(t *testing.T) {
	    var a	  Adder

	   a = IAdder{0, 1, 2}
	   a.Add(1)
	   if i.Result().(int) != 1 {
	   	     t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1)
	   }
	   a.Subtract(2)
	   if a.Result().(int) != -1 {
	   	     t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1)
	   }

	   a = FAdder{0.0, 1.0, 2.0}
	   a.Add(1)
	   if a.Result().(float32) != 1.0 {
	   	     t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0)
	   }
}
func TestAdder(t *testing.T) {
	    var a	  Adder

	   a = IAdder{0, 1, 2}
	   a.Add(1)
	   if i.Result().(int) != 1 {
	   	     t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1)
	   }
	   a.Subtract(2)
	   if a.Result().(int) != -1 {
	   	     t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1)
	   }

	   a = FAdder{0.0, 1.0, 2.0}
	   a.Add(1)
	   if a.Result().(float32) != 1.0 {
	   	     t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0)
	   }
}
func TestAdder(t *testing.T) {
	    var a	  Adder

	   a = IAdder{0, 1, 2}
	   a.Add(1)
	   if i.Result().(int) != 1 {
	   	     t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1)
	   }
	   a.Subtract(2)
	   if a.Result().(int) != -1 {
	   	     t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1)
	   }

	   a = FAdder{0.0, 1.0, 2.0}
	   a.Add(1)
	   if a.Result().(float32) != 1.0 {
	   	     t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0)
	   }
}
func TestAdder(t *testing.T) {
	    var a	  Adder

	   a = IAdder{0, 1, 2}
	   a.Add(1)
	   if i.Result().(int) != 1 {
	   	     t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1)
	   }
	   a.Subtract(2)
	   if a.Result().(int) != -1 {
	   	     t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1)
	   }

	   a = FAdder{0.0, 1.0, 2.0}
	   a.Add(1)
	   if a.Result().(float32) != 1.0 {
	   	     t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0)
	   }
}
func TestAdder(t *testing.T) {
	    var a	  Adder

	   a = IAdder{0, 1, 2}
	   a.Add(1)
	   if i.Result().(int) != 1 {
	   	     t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1)
	   }
	   a.Subtract(2)
	   if a.Result().(int) != -1 {
	   	     t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1)
	   }

	   a = FAdder{0.0, 1.0, 2.0}
	   a.Add(1)
	   if a.Result().(float32) != 1.0 {
	   	     t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0)
	   }
}
func TestAdder(t *testing.T) {
	    var a	  Adder

	   a = IAdder{0, 1, 2}
	   a.Add(1)
	   if i.Result().(int) != 1 {
	   	     t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1)
	   }
	   a.Subtract(2)
	   if a.Result().(int) != -1 {
	   	     t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1)
	   }

	   a = FAdder{0.0, 1.0, 2.0}
	   a.Add(1)
	   if a.Result().(float32) != 1.0 {
	   	     t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0)
	   }
}
func TestAdder(t *testing.T) {
	    var a	  Adder

	   a = IAdder{0, 1, 2}
	   a.Add(1)
	   if i.Result().(int) != 1 {
	   	     t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1)
	   }
	   a.Subtract(2)
	   if a.Result().(int) != -1 {
	   	     t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1)
	   }

	   a = FAdder{0.0, 1.0, 2.0}
	   a.Add(1)
	   if a.Result().(float32) != 1.0 {
	   	     t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0)
	   }
}
down a rabbit hole
an object has known static type
down a rabbit hole
an object has known static type
this fixed type is determined at linking
down a rabbit hole
an object has known static type
this fixed type is determined at linking
no new types can be created at runtime
down a rabbit hole
an object has known static type
this fixed type is determined at linking
no new types can be created at runtime
so dynamism is bounded to a fixed set
down a rabbit hole
an object has known static type
this fixed type is determined at linking
no new types can be created at runtime
so dynamism is bounded to this fixed set
and computer scientists are happier
unit tests as REPL
   testing that doesn’t suck
func (b Buffer) Eq(o Buffer) (r bool) {
	    if len(b) == len(o) {
	    	     for i := len(b) - 1; i > 0; i-- {
	    	     	     if b[i] != o[i] {
	    	     	     	     return
	    	     	     }
	    	     }
	    	     r = true
	    }
	    return
}
func (b Buffer) Eq(o Buffer) (r bool) {
	    if len(b) == len(o) {
	    	     for i := len(b) - 1; i > 0; i-- {
	    	     	     if b[i] != o[i] {
	    	     	     	     return
	    	     	     }
	    	     }
	    	     r = true
	    }
	    return
}
func (b Buffer) Eq(o Buffer) (r bool) {
	    if len(b) == len(o) {
	    	     for i := len(b) - 1; i > 0; i-- {
	    	     	     if b[i] != o[i] {
	    	     	     	     return
	    	     	     }
	    	     }
	    	     r = true
	    }
	    return
}
func (b Buffer) Eq(o Buffer) (r bool) {
	    if len(b) == len(o) {
	    	     for i := len(b) - 1; i > 0; i-- {
	    	     	     if b[i] != o[i] {
	    	     	     	     return
	    	     	     }
	    	     }
	    	     r = true
	    }
	    return
}
func (b Buffer) Eq(o Buffer) (r bool) {
	    if len(b) == len(o) {
	    	     for i := len(b) - 1; i > 0; i-- {
	    	     	     if b[i] != o[i] {
	    	     	     	     return
	    	     	     }
	    	     }
	    	     r = true
	    }
	    return
}
func (b Buffer) Eq(o Buffer) (r bool) {
	    if len(b) == len(o) {
	    	     for i := len(b) - 1; i > 0; i-- {
	    	     	     if b[i] != o[i] {
	    	     	     	     return
	    	     	     }
	    	     }
	    	     r = true
	    }
	    return
}
func (b Buffer) Eq(o Buffer) (r bool) {
	    if len(b) == len(o) {
	    	     for i := len(b) - 1; i > 0; i-- {
	    	     	     if b[i] != o[i] {
	    	     	     	     return
	    	     	     }
	    	     }
	    	     r = true
	    }
	    return
}
package Vector

import "testing"

func TestVectorSwap(t *testing.T) {
	    i := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    v := i.Clone()
	    v.Swap(1, 2)
	    r := Vector{Buffer{0, 2, 1, 3, 4, 5}}
	    switch {
	    case !v.Eq(r.Buffer):	 	       fallthrough
	    case !v.Buffer.Eq(r.Buffer):	 t.Fatalf("b[0:5] = %v", v)
	    }
}
package Vector

import "testing"

func TestVectorSwap(t *testing.T) {
	    i := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    v := i.Clone()
	    v.Swap(1, 2)
	    r := Vector{Buffer{0, 2, 1, 3, 4, 5}}
	    switch {
	    case !v.Eq(r.Buffer):	 	       fallthrough
	    case !v.Buffer.Eq(r.Buffer):	 t.Fatalf("b[0:5] = %v", v)
	    }
}
package Vector

import "testing"

func TestVectorSwap(t *testing.T) {
	    i := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    v := i.Clone()
	    v.Swap(1, 2)
	    r := Vector{Buffer{0, 2, 1, 3, 4, 5}}
	    switch {
	    case !v.Eq(r.Buffer):	 	       fallthrough
	    case !v.Buffer.Eq(r.Buffer):	 t.Fatalf("b[0:5] = %v", v)
	    }
}
package Vector

import "testing"

func TestVectorSwap(t *testing.T) {
	    i := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    v := i.Clone()
	    v.Swap(1, 2)
	    r := Vector{Buffer{0, 2, 1, 3, 4, 5}}
	    switch {
	    case !v.Eq(r.Buffer):	 	       fallthrough
	    case !v.Buffer.Eq(r.Buffer):	 t.Fatalf("b[0:5] = %v", v)
	    }
}
package Vector

import "testing"

func TestVectorSwap(t *testing.T) {
	    i := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    v := i.Clone()
	    v.Swap(1, 2)
	    r := Vector{Buffer{0, 2, 1, 3, 4, 5}}
	    switch {
	    case !v.Eq(r.Buffer):	 	       fallthrough
	    case !v.Buffer.Eq(r.Buffer):	 t.Fatalf("b[0:5] = %v", v)
	    }
}
package Vector

import "testing"

func TestVectorSwap(t *testing.T) {
	    i := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    v := i.Clone()
	    v.Swap(1, 2)
	    r := Vector{Buffer{0, 2, 1, 3, 4, 5}}
	    switch {
	    case !v.Eq(r.Buffer):	 	       fallthrough
	    case !v.Buffer.Eq(r.Buffer):	 t.Fatalf("b[0:5] = %v", v)
	    }
}
package Vector

import "testing"

func TestVectorSwap(t *testing.T) {
	    i := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    v := i.Clone()
	    v.Swap(1, 2)
	    r := Vector{Buffer{0, 2, 1, 3, 4, 5}}
	    switch {
	    case !v.Eq(r.Buffer):	 	       fallthrough
	    case !v.Buffer.Eq(r.Buffer):	 t.Fatalf("b[0:5] = %v", v)
	    }
}
package Vector

import "testing"

func TestVectorSwap(t *testing.T) {
	    i := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    v := i.Clone()
	    v.Swap(1, 2)
	    r := Vector{Buffer{0, 2, 1, 3, 4, 5}}
	    switch {
	    case !v.Eq(r.Buffer):	 	       fallthrough
	    case !v.Buffer.Eq(r.Buffer):	 t.Fatalf("b[0:5] = %v", v)
	    }
}
include $(GOROOT)/src/Make.inc

TARG=integer

GOFILES=
	   integer.go
	   vector.go

include $(GOROOT)/src/Make.pkg
package Vector

import "testing"
import "vector"

func BenchmarkVectorClone6(b *testing.B) {
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    for i := 0; i < b.N; i++ {
	    	     _ = v.Clone()
	    }
}

func BenchmarkVectorSwap(b *testing.B) {
	    b.StopTimer()
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    b.StartTimer()
	    for i := 0; i < b.N; i++ {
	    	     v.Swap(1, 2)
	    }
}
package Vector

import "testing"
import "vector"

func BenchmarkVectorClone6(b *testing.B) {
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    for i := 0; i < b.N; i++ {
	    	     _ = v.Clone()
	    }
}

func BenchmarkVectorSwap(b *testing.B) {
	    b.StopTimer()
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    b.StartTimer()
	    for i := 0; i < b.N; i++ {
	    	     v.Swap(1, 2)
	    }
}
package Vector

import "testing"
import "vector"

func BenchmarkVectorClone6(b *testing.B) {
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    for i := 0; i < b.N; i++ {
	    	     _ = v.Clone()
	    }
}

func BenchmarkVectorSwap(b *testing.B) {
	    b.StopTimer()
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    b.StartTimer()
	    for i := 0; i < b.N; i++ {
	    	     v.Swap(1, 2)
	    }
}
package Vector

import "testing"
import "vector"

func BenchmarkVectorClone6(b *testing.B) {
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    for i := 0; i < b.N; i++ {
	    	     _ = v.Clone()
	    }
}

func BenchmarkVectorSwap(b *testing.B) {
	    b.StopTimer()
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    b.StartTimer()
	    for i := 0; i < b.N; i++ {
	    	     v.Swap(1, 2)
	    }
}
package Vector

import "testing"
import "vector"

func BenchmarkVectorClone6(b *testing.B) {
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    for i := 0; i < b.N; i++ {
	    	     _ = v.Clone()
	    }
}

func BenchmarkVectorSwap(b *testing.B) {
	    b.StopTimer()
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    b.StartTimer()
	    for i := 0; i < b.N; i++ {
	    	     v.Swap(1, 2)
	    }
}
package Vector

import "testing"
import "vector"

func BenchmarkVectorClone6(b *testing.B) {
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    for i := 0; i < b.N; i++ {
	    	     _ = v.Clone()
	    }
}

func BenchmarkVectorSwap(b *testing.B) {
	    b.StopTimer()
	    v := Vector{Buffer{0, 1, 2, 3, 4, 5}}
	    b.StartTimer()
	    for i := 0; i < b.N; i++ {
	    	     v.Swap(1, 2)
	    }
}
$ gotest -bench="Benchmark"
rm -f _test/scripts.a
6g -o _gotest_.6 integer.go vector.go nominal_typing_test.go
embedded_typing_benchmark_test.go embedded_typing_test.go
rm -f _test/scripts.a
gopack grc _test/scripts.a _gotest_.6
PASS
integer.BenchmarkVectorSwap	 200000000	               8 ns/op
integer.BenchmarkVectorClone6	 10000000	             300 ns/op
$ gotest -bench="Benchmark"
rm -f _test/scripts.a
6g -o _gotest_.6 integer.go vector.go nominal_typing_test.go
embedded_typing_benchmark_test.go embedded_typing_test.go
rm -f _test/scripts.a
gopack grc _test/scripts.a _gotest_.6
PASS
integer.BenchmarkVectorSwap	 200000000	               8 ns/op
integer.BenchmarkVectorClone6	 10000000	             300 ns/op
$ gotest -bench="Benchmark"
rm -f _test/scripts.a
6g -o _gotest_.6 integer.go vector.go nominal_typing_test.go
embedded_typing_benchmark_test.go embedded_typing_test.go
rm -f _test/scripts.a
gopack grc _test/scripts.a _gotest_.6
PASS
integer.BenchmarkVectorSwap	 200000000	               8 ns/op
integer.BenchmarkVectorClone6	 10000000	             300 ns/op
$ gotest -bench="Benchmark"
rm -f _test/scripts.a
6g -o _gotest_.6 integer.go vector.go nominal_typing_test.go
embedded_typing_benchmark_test.go embedded_typing_test.go
rm -f _test/scripts.a
gopack grc _test/scripts.a _gotest_.6
PASS
integer.BenchmarkVectorSwap	 200000000	               8 ns/op
integer.BenchmarkVectorClone6	 10000000	             300 ns/op
$ gotest -bench="Benchmark"
rm -f _test/scripts.a
6g -o _gotest_.6 integer.go vector.go nominal_typing_test.go
embedded_typing_benchmark_test.go embedded_typing_test.go
rm -f _test/scripts.a
gopack grc _test/scripts.a _gotest_.6
PASS
integer.BenchmarkVectorSwap	 200000000	               8 ns/op
integer.BenchmarkVectorClone6	 10000000	             300 ns/op
exceptional fun
because Go doesn’t have exceptions - honest!
func Throw() {
	    panic(nil)
}

func Catch(f func()) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     panic(x)
	    	    }
	    }()
	    f()
}

func CatchAll(f func()) {
	    defer func() {
	    	    recover()
	    }()
	    f()
}
func Throw() {
	    panic(nil)
}

func Catch(f func()) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     panic(x)
	    	    }
	    }()
	    f()
}

func CatchAll(f func()) {
	    defer func() {
	    	    recover()
	    }()
	    f()
}
func Throw() {
	    panic(nil)
}

func Catch(f func()) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     panic(x)
	    	    }
	    }()
	    f()
}

func CatchAll(f func()) {
	    defer func() {
	    	    recover()
	    }()
	    f()
}
func Throw() {
	    panic(nil)
}

func Catch(f func()) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     panic(x)
	    	    }
	    }()
	    f()
}

func CatchAll(f func()) {
	    defer func() {
	    	    recover()
	    }()
	    f()
}
func Throw() {
	    panic(nil)
}

func Catch(f func()) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     panic(x)
	    	    }
	    }()
	    f()
}

func CatchAll(f func()) {
	    defer func() {
	    	    recover()
	    }()
	    f()
}
func Throw() {
	    panic(nil)
}

func Catch(f func()) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     panic(x)
	    	    }
	    }()
	    f()
}

func CatchAll(f func()) {
	    defer func() {
	    	    recover()
	    }()
	    f()
}
func Throw() {
	    panic(nil)
}

func Catch(f func()) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     panic(x)
	    	    }
	    }()
	    f()
}

func CatchAll(f func()) {
	    defer func() {
	    	    recover()
	    }()
	    f()
}
func Throw() {
	    panic(nil)
}

func Catch(f func()) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     panic(x)
	    	    }
	    }()
	    f()
}

func CatchAll(f func()) {
	    defer func() {
	    	    recover()
	    }()
	    f()
}
func Throw() {
	    panic(nil)
}

func Catch(f func()) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     panic(x)
	    	    }
	    }()
	    f()
}

func CatchAll(f func()) {
	    defer func() {
	    	    recover()
	    }()
	    f()
}
func Throw() {
	    panic(nil)
}

func Catch(f func()) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     panic(x)
	    	    }
	    }()
	    f()
}

func CatchAll(f func()) {
	    defer func() {
	    	    recover()
	    }()
	    f()
}
func throwsPanic(f func()) (b bool) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     b = true
	    	    }
	    }()
	    f()
	    return
}
func throwsPanic(f func()) (b bool) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     b = true
	    	    }
	    }()
	    f()
	    return
}
func throwsPanic(f func()) (b bool) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     b = true
	    	    }
	    }()
	    f()
	    return
}
func throwsPanic(f func()) (b bool) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     b = true
	    	    }
	    }()
	    f()
	    return
}
func throwsPanic(f func()) (b bool) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     b = true
	    	    }
	    }()
	    f()
	    return
}
func throwsPanic(f func()) (b bool) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     b = true
	    	    }
	    }()
	    f()
	    return
}
func throwsPanic(f func()) (b bool) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     b = true
	    	    }
	    }()
	    f()
	    return
}
func throwsPanic(f func()) (b bool) {
	    defer func() {
	    	    if x := recover(); x != nil {
	    	    	     b = true
	    	    }
	    }()
	    f()
	    return
}
import "fmt"
import "path"
import "runtime"

func StackTrace() {
	    var stack_trace	   []uintptr
	    var my_path	 	     string

	   runtime.Callers(1, stack_trace)
	   for i, u := range stack_trace {
	   	     if f := runtime.FuncForPC(u); f != nil {
	   	     	     file, line := f.FileLine(u)
	   	     	     switch filepath, filename := path.Split(file); {
	   	     	     case i == 0:	 	      	    	 my_path = filepath
	   	     	     case my_path != filepath:	 fmt.Printf("%v:%v", filename, line)
	   	     	     }
	   	     } else {
	   	     	     fmt.Println("(unknown)")
	   	     }
	   }
}
import "fmt"
import "path"
import "runtime"

func StackTrace() {
	    var stack_trace	   []uintptr
	    var my_path	 	     string

	   runtime.Callers(1, stack_trace)
	   for i, u := range stack_trace {
	   	     if f := runtime.FuncForPC(u); f != nil {
	   	     	     file, line := f.FileLine(u)
	   	     	     switch filepath, filename := path.Split(file); {
	   	     	     case i == 0:	 	      	    	 my_path = filepath
	   	     	     case my_path != filepath:	 fmt.Printf("%v:%v", filename, line)
	   	     	     }
	   	     } else {
	   	     	     fmt.Println("(unknown)")
	   	     }
	   }
}
import "fmt"
import "path"
import "runtime"

func StackTrace() {
	    var stack_trace	   []uintptr
	    var my_path	 	     string

	   runtime.Callers(1, stack_trace)
	   for i, u := range stack_trace {
	   	     if f := runtime.FuncForPC(u); f != nil {
	   	     	     file, line := f.FileLine(u)
	   	     	     switch filepath, filename := path.Split(file); {
	   	     	     case i == 0:	 	      	    	 my_path = filepath
	   	     	     case my_path != filepath:	 fmt.Printf("%v:%v", filename, line)
	   	     	     }
	   	     } else {
	   	     	     fmt.Println("(unknown)")
	   	     }
	   }
}
import "fmt"
import "path"
import "runtime"

func StackTrace() {
	    var stack_trace	   []uintptr
	    var my_path	 	     string

	   runtime.Callers(1, stack_trace)
	   for i, u := range stack_trace {
	   	     if f := runtime.FuncForPC(u); f != nil {
	   	     	     file, line := f.FileLine(u)
	   	     	     switch filepath, filename := path.Split(file); {
	   	     	     case i == 0:	 	      	    	 my_path = filepath
	   	     	     case my_path != filepath:	 fmt.Printf("%v:%v", filename, line)
	   	     	     }
	   	     } else {
	   	     	     fmt.Println("(unknown)")
	   	     }
	   }
}
import "fmt"
import "path"
import "runtime"

func StackTrace() {
	    var stack_trace	   []uintptr
	    var my_path	 	     string

	   runtime.Callers(1, stack_trace)
	   for i, u := range stack_trace {
	   	     if f := runtime.FuncForPC(u); f != nil {
	   	     	     file, line := f.FileLine(u)
	   	     	     switch filepath, filename := path.Split(file); {
	   	     	     case i == 0:	 	      	    	 my_path = filepath
	   	     	     case my_path != filepath:	 fmt.Printf("%v:%v", filename, line)
	   	     	     }
	   	     } else {
	   	     	     fmt.Println("(unknown)")
	   	     }
	   }
}
import "fmt"
import "path"
import "runtime"

func StackTrace() {
	    var stack_trace	   []uintptr
	    var my_path	 	     string

	   runtime.Callers(1, stack_trace)
	   for i, u := range stack_trace {
	   	     if f := runtime.FuncForPC(u); f != nil {
	   	     	     file, line := f.FileLine(u)
	   	     	     switch filepath, filename := path.Split(file); {
	   	     	     case i == 0:	 	      	    	 my_path = filepath
	   	     	     case my_path != filepath:	 fmt.Printf("%v:%v", filename, line)
	   	     	     }
	   	     } else {
	   	     	     fmt.Println("(unknown)")
	   	     }
	   }
}
import "fmt"
import "path"
import "runtime"

func StackTrace() {
	    var stack_trace	   []uintptr
	    var my_path	 	     string

	   runtime.Callers(1, stack_trace)
	   for i, u := range stack_trace {
	   	     if f := runtime.FuncForPC(u); f != nil {
	   	     	     file, line := f.FileLine(u)
	   	     	     switch filepath, filename := path.Split(file); {
	   	     	     case i == 0:	 	      	    	 my_path = filepath
	   	     	     case my_path != filepath:	 fmt.Printf("%v:%v", filename, line)
	   	     	     }
	   	     } else {
	   	     	     fmt.Println("(unknown)")
	   	     }
	   }
}
import "fmt"
import "path"
import "runtime"

func StackTrace() {
	    var stack_trace	   []uintptr
	    var my_path	 	     string

	   runtime.Callers(1, stack_trace)
	   for i, u := range stack_trace {
	   	     if f := runtime.FuncForPC(u); f != nil {
	   	     	     file, line := f.FileLine(u)
	   	     	     switch filepath, filename := path.Split(file); {
	   	     	     case i == 0:	 	      	    	 my_path = filepath
	   	     	     case my_path != filepath:	 fmt.Printf("%v:%v", filename, line)
	   	     	     }
	   	     } else {
	   	     	     fmt.Println("(unknown)")
	   	     }
	   }
}
import "fmt"
import "path"
import "runtime"

func StackTrace() {
	    var stack_trace	   []uintptr
	    var my_path	 	     string

	   runtime.Callers(1, stack_trace)
	   for i, u := range stack_trace {
	   	     if f := runtime.FuncForPC(u); f != nil {
	   	     	     file, line := f.FileLine(u)
	   	     	     switch filepath, filename := path.Split(file); {
	   	     	     case i == 0:	 	      	    	 my_path = filepath
	   	     	     case my_path != filepath:	 fmt.Printf("%v:%v", filename, line)
	   	     	     }
	   	     } else {
	   	     	     fmt.Println("(unknown)")
	   	     }
	   }
}
import "fmt"
import "path"
import "runtime"

func StackTrace() {
	    var stack_trace	   []uintptr
	    var my_path	 	     string

	   runtime.Callers(1, stack_trace)
	   for i, u := range stack_trace {
	   	     if f := runtime.FuncForPC(u); f != nil {
	   	     	     file, line := f.FileLine(u)
	   	     	     switch filepath, filename := path.Split(file); {
	   	     	     case i == 0:	 	      	    	 my_path = filepath
	   	     	     case my_path != filepath:	 fmt.Printf("%v:%v", filename, line)
	   	     	     }
	   	     } else {
	   	     	     fmt.Println("(unknown)")
	   	     }
	   }
}
import "fmt"
import "path"
import "runtime"

func StackTrace() {
	    var stack_trace	   []uintptr
	    var my_path	 	     string

	   runtime.Callers(1, stack_trace)
	   for i, u := range stack_trace {
	   	     if f := runtime.FuncForPC(u); f != nil {
	   	     	     file, line := f.FileLine(u)
	   	     	     switch filepath, filename := path.Split(file); {
	   	     	     case i == 0:	 	      	    	 my_path = filepath
	   	     	     case my_path != filepath:	 fmt.Printf("%v:%v", filename, line)
	   	     	     }
	   	     } else {
	   	     	     fmt.Println("(unknown)")
	   	     }
	   }
}
reflections on Go
dynamism through run-time type manipulation
package generalise

import "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := reflect.ValueOf(i); v.Kind() {
	    case reflect.Slice:	 	    l := v.Cap()
	    	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    	    }
	    	    	    	    	    	    n = reflect.MakeSlice(v.Type(), l, l).Interface()

	   case reflect.Map:	 	      n = reflect.MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := reflect.ValueOf(i); v.Kind() {
	    case reflect.Slice:	 	    l := v.Cap()
	    	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    	    }
	    	    	    	    	    	    n = reflect.MakeSlice(v.Type(), l, l).Interface()

	   case reflect.Map:	 	      n = reflect.MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
package generalise

import . "reflect"

func Allocate(i interface{}, limit... int) (n interface{}) {
	    switch v := ValueOf(i); v.Kind() {
	    case Slice:	 	      l := v.Cap()
	    	    	    	    	    if len(limit) > 0 {
	    	    	    	    	    	     l = limit[0]
	    	    	    	    	    }
	    	    	    	    	    n = MakeSlice(v.Type(), l, l).Interface()

	   case Map:	       	   n = MakeMap(v.Type()).Interface()
	   }
	   return
}
func TestAllocate(t *testing.T) {
	    var s2 []int

	   s1 := []int{0, 1, 2}
	   m := map[int] int{1: 1, 2: 2, 3: 3}
	   switch {
	   case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }):
	   	    t.Fatal("Unable to allocate new slice")

	   case len(s2) != 1 || cap(s2) != 1:
	   	    t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2)

	   case throwsPanic(func() { Allocate(m) }):
	   	    t.Fatal("Unable to allocate new map")
	   }
}
func TestAllocate(t *testing.T) {
	    var s2 []int

	   s1 := []int{0, 1, 2}
	   m := map[int] int{1: 1, 2: 2, 3: 3}
	   switch {
	   case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }):
	   	    t.Fatal("Unable to allocate new slice")

	   case len(s2) != 1 || cap(s2) != 1:
	   	    t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2)

	   case throwsPanic(func() { Allocate(m) }):
	   	    t.Fatal("Unable to allocate new map")
	   }
}
func TestAllocate(t *testing.T) {
	    var s2 []int

	   s1 := []int{0, 1, 2}
	   m := map[int] int{1: 1, 2: 2, 3: 3}
	   switch {
	   case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }):
	   	    t.Fatal("Unable to allocate new slice")

	   case len(s2) != 1 || cap(s2) != 1:
	   	    t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2)

	   case throwsPanic(func() { Allocate(m) }):
	   	    t.Fatal("Unable to allocate new map")
	   }
}
func TestAllocate(t *testing.T) {
	    var s2 []int

	   s1 := []int{0, 1, 2}
	   m := map[int] int{1: 1, 2: 2, 3: 3}
	   switch {
	   case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }):
	   	    t.Fatal("Unable to allocate new slice")

	   case len(s2) != 1 || cap(s2) != 1:
	   	    t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2)

	   case throwsPanic(func() { Allocate(m) }):
	   	    t.Fatal("Unable to allocate new map")
	   }
}
func TestAllocate(t *testing.T) {
	    var s2 []int

	   s1 := []int{0, 1, 2}
	   m := map[int] int{1: 1, 2: 2, 3: 3}
	   switch {
	   case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }):
	   	    t.Fatal("Unable to allocate new slice")

	   case len(s2) != 1 || cap(s2) != 1:
	   	    t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2)

	   case throwsPanic(func() { Allocate(m) }):
	   	    t.Fatal("Unable to allocate new map")
	   }
}
func TestAllocate(t *testing.T) {
	    var s2 []int

	   s1 := []int{0, 1, 2}
	   m := map[int] int{1: 1, 2: 2, 3: 3}
	   switch {
	   case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }):
	   	    t.Fatal("Unable to allocate new slice")

	   case len(s2) != 1 || cap(s2) != 1:
	   	    t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2)

	   case throwsPanic(func() { Allocate(m) }):
	   	    t.Fatal("Unable to allocate new map")
	   }
}
func TestAllocate(t *testing.T) {
	    var s2 []int

	   s1 := []int{0, 1, 2}
	   m := map[int] int{1: 1, 2: 2, 3: 3}
	   switch {
	   case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }):
	   	    t.Fatal("Unable to allocate new slice")

	   case len(s2) != 1 || cap(s2) != 1:
	   	    t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2)

	   case throwsPanic(func() { Allocate(m) }):
	   	    t.Fatal("Unable to allocate new map")
	   }
}
func TestAllocate(t *testing.T) {
	    var s2 []int

	   s1 := []int{0, 1, 2}
	   m := map[int] int{1: 1, 2: 2, 3: 3}
	   switch {
	   case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }):
	   	    t.Fatal("Unable to allocate new slice")

	   case len(s2) != 1 || cap(s2) != 1:
	   	    t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2)

	   case throwsPanic(func() { Allocate(m) }):
	   	    t.Fatal("Unable to allocate new map")
	   }
}
func TestAllocate(t *testing.T) {
	    var s2 []int

	   s1 := []int{0, 1, 2}
	   m := map[int] int{1: 1, 2: 2, 3: 3}
	   switch {
	   case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }):
	   	    t.Fatal("Unable to allocate new slice")

	   case len(s2) != 1 || cap(s2) != 1:
	   	    t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2)

	   case throwsPanic(func() { Allocate(m) }):
	   	    t.Fatal("Unable to allocate new map")
	   }
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
func Duplicate(i interface{}) (clone interface{}) {
	    if clone = Allocate(i); clone != nil {
	    	     switch clone := ValueOf(clone); clone.Kind() {
	    	     case Slice:	 	      	    Copy(clone, ValueOf(i))

	   	    case Map:	     	    	    m := ValueOf(i)
	   	    	    	   	     	    	    for _, k := range m.Keys() {
	   	    	    	   	     	    	    	    clone.SetMapIndex(k, m.MapIndex(k))
	   	    	    	   	     	    	    }
	   	    }
	   }
	   return
}
metallic k.o.
sometimes a bit-buffer is just a bit-buffer
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
package raw

import . "reflect"
import "unsafe"

var _BYTE_SLICE Type = Typeof([]byte(nil))

type MemoryBlock interface {
	    ByteSlice() []byte
}

func valueHeader(v Value) (header *SliceHeader) {
	    if v.IsValid() {
	    	     s := int(v.Type().Size())
	    	     header = &SliceHeader{ v.UnsafeAddr(), s, s }
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) {
	    switch value := Indirect(ValueOf(i)); value.Kind() {
	    case Slice:	 	      Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr()))
	    	    	    	    	    t := value.Type().Elem()
	    	    	    	    	    Size = int(t.Size())
	    	    	    	    	    Align = t.Align()
	    case Interface:	    Header, Size, Align = SliceHeader(value.Elem())
	    }
	    return
}

func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) {
	    if oldHeader != nil {
	    	     s := float64(oldESize) / float64(newESize)
	    	     h = &SliceHeader{ Data: oldHeader.Data }
	    	     h.Len = int(float64(oldHeader.Len) * s)
	    	     h.Cap = int(float64(oldHeader.Cap) * s)
	    }
	    return
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
func ByteSlice(i interface{}) []byte {
	    switch i := i.(type) {
	    case []byte:	 	      	  	    return i
	    case MemoryBlock:	   	  return i.ByteSlice()
	    }

	   var header *SliceHeader
	   switch v := ValueOf(i); value.Kind() {
	   case Interface, Ptr:	header = valueHeader(v.Elem())

	   case Slice:	   	    	    h, s, _ := SliceHeader(i)
	   	    	    	    	    	    header = Scale(h, s, 1)

	   case String:	 	     	    s := v.Get()
	   	    	    	   	     	    h := *(*StringHeader)(unsafe.Pointer(&s))
	   	    	    	   	     	    header = &SliceHeader{ h.Data, h.Len, h.Len }

	   default:	 	   	   	    header = valueHeader(v)
	   }
	   return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte)
}
go f(){}() / yourself
            /
   map/reduce for all the family
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func() {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-c)           produces:
	   	     }                                 0110011101011010
	   }()
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func() {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-c)           produces:
	   	     }                                 0110011101011010
	   }()
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func() {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-c)           produces:
	   	     }                                 0110011101011010
	   }()
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func() {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-c)           produces:
	   	     }                                 0110011101011010
	   }()
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func() {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-c)           produces:
	   	     }                                 0110011101011010
	   }()
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func() {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-c)           produces:
	   	     }                                 0110011101011010
	   }()
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func() {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-c)           produces:
	   	     }                                 0110011101011010
	   }()
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func(in chan int) {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-in)          produces:
	   	     }                                 0110011101011010
	   }(c)
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func(in chan int) {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-in)          produces:
	   	     }                                 0110011101011010
	   }(c)
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func(in chan int) {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-in)          produces:
	   	     }                                 0110011101011010
	   }(c)
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func(in chan int) {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-in)          produces:
	   	     }                                 0110011101011010
	   }(c)
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func(in chan int) {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-in)          produces:
	   	     }                                 0110011101011010
	   }(c)
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func(in chan int) {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-in)          produces:
	   	     }                                 0110011101011010
	   }(c)
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func(in chan int) {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-in)          produces:
	   	     }                                 0110011101011010
	   }(c)
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
package main
import "fmt"

func main() {
	    var c chan int

	   c = make(chan int)
	   limit := 16
	   go func(in chan int) {
	   	     for i := limit; i > 0; i-- {
	   	     	     fmt.Print(<-in)          produces:
	   	     }                                 0110011101011010
	   }(c)
	   for i := limit; i > 0; i-- {
	   	     select {
	   	     case c <- 0:
	   	     case c <- 1:
	   	     }
	   }
}
func main() {
	    var c chan int

	   c = make(chan int, 16)
	   go func() {
	   	    for i := 16; i > 0; i-- {
	   	    	     fmt.Print(<-c)
	   	    }
	   }()
	   go func() {
	   	    select {                    produces:
	   	    case c <- 0:                   0110011101011010
	   	    case c <- 1:
	   	    }
	   }()
	   for {}
}
func main() {
	    var c chan int

	   c = make(chan int, 16)
	   go func() {
	   	    for i := 16; i > 0; i-- {
	   	    	     fmt.Print(<-c)
	   	    }
	   }()
	   go func() {
	   	    select {                    produces:
	   	    case c <- 0:                   0110011101011010
	   	    case c <- 1:
	   	    }
	   }()
	   for {}
}
func main() {
	    var c chan int

	   c = make(chan int, 16)
	   go func() {
	   	    for i := 16; i > 0; i-- {
	   	    	     fmt.Print(<-c)
	   	    }
	   }()
	   go func() {
	   	    select {                    produces:
	   	    case c <- 0:                   0110011101011010
	   	    case c <- 1:
	   	    }
	   }()
	   for {}
}
func main() {
	    var c chan int

	   c = make(chan int, 16)
	   go func() {
	   	    for i := 16; i > 0; i-- {
	   	    	     fmt.Print(<-c)
	   	    }
	   }()
	   go func() {
	   	    select {                    produces:
	   	    case c <- 0:                   0110011101011010
	   	    case c <- 1:
	   	    }
	   }()
	   for {}
}
package generalise

type SignalSource func(status chan bool)

func Wait(s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    <-done
}

func WaitAll(count int, s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    for i := 0; i < count; i++ {
	    	     <- done
	    }
}
package generalise

type SignalSource func(status chan bool)

func Wait(s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    <-done
}

func WaitAll(count int, s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    for i := 0; i < count; i++ {
	    	     <- done
	    }
}
package generalise

type SignalSource func(status chan bool)

func Wait(s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    <-done
}

func WaitAll(count int, s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    for i := 0; i < count; i++ {
	    	     <- done
	    }
}
package generalise

type SignalSource func(status chan bool)

func Wait(s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    <-done
}

func WaitAll(count int, s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    for i := 0; i < count; i++ {
	    	     <- done
	    }
}
package generalise

type SignalSource func(status chan bool)

func Wait(s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    <-done
}

func WaitAll(count int, s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    for i := 0; i < count; i++ {
	    	     <- done
	    }
}
package generalise

type SignalSource func(status chan bool)

func Wait(s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    <-done
}

func WaitAll(count int, s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    for i := 0; i < count; i++ {
	    	     <- done
	    }
}
package generalise

type SignalSource func(status chan bool)

func Wait(s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    <-done
}

func WaitAll(count int, s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    for i := 0; i < count; i++ {
	    	     <- done
	    }
}
package generalise

type SignalSource func(status chan bool)

func Wait(s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    <-done
}

func WaitAll(count int, s SignalSource) {
	    done := make(chan bool)
	    defer close(done)
	    go s(done)
	    for i := 0; i < count; i++ {
	    	     <- done
	    }
}
type Iteration func(k, x interface{}) bool

func (i Iteration) apply(k, v interface{}, c chan bool) {
	    go func() {
	    	     c <-i(k, v)
	    }()
}

func (f Iteration) Each(c interface{}) {
	    switch c := ValueOf(c); c.Kind() {
	    case Slice:	 	     WaitAll(c.Len(), SignalSource(func(done chan bool) {
	    	     	    	   	   	     for i := 0; i < c.Len(); i++ {
	    	     	    	   	   	     	     f.apply(i, c.Elem(i).Interface(), done) }}))

	   case Map:	     	    WaitAll(c.Len(), SignalSource(func(done chan bool) {
	   	    	   	     	    	   for _, k := range c.Keys() {
	   	    	   	     	    	   	    f.apply(k, c.Elem(k).Interface(), done) }}))
	   }
}
type Iteration func(k, x interface{}) bool

func (i Iteration) apply(k, v interface{}, c chan bool) {
	    go func() {
	    	     c <-i(k, v)
	    }()
}

func (f Iteration) Each(c interface{}) {
	    switch c := ValueOf(c); c.Kind() {
	    case Slice:	 	     WaitAll(c.Len(), SignalSource(func(done chan bool) {
	    	     	    	   	   	     for i := 0; i < c.Len(); i++ {
	    	     	    	   	   	     	     f.apply(i, c.Elem(i).Interface(), done) }}))

	   case Map:	     	    WaitAll(c.Len(), SignalSource(func(done chan bool) {
	   	    	   	     	    	   for _, k := range c.Keys() {
	   	    	   	     	    	   	    f.apply(k, c.Elem(k).Interface(), done) }}))
	   }
}
type Iteration func(k, x interface{}) bool

func (i Iteration) apply(k, v interface{}, c chan bool) {
	    go func() {
	    	     c <-i(k, v)
	    }()
}

func (f Iteration) Each(c interface{}) {
	    switch c := ValueOf(c); c.Kind() {
	    case Slice:	 	     WaitAll(c.Len(), SignalSource(func(done chan bool) {
	    	     	    	   	   	     for i := 0; i < c.Len(); i++ {
	    	     	    	   	   	     	     f.apply(i, c.Elem(i).Interface(), done) }}))

	   case Map:	     	    WaitAll(c.Len(), SignalSource(func(done chan bool) {
	   	    	   	     	    	   for _, k := range c.Keys() {
	   	    	   	     	    	   	    f.apply(k, c.Elem(k).Interface(), done) }}))
	   }
}
type Iteration func(k, x interface{}) bool

func (i Iteration) apply(k, v interface{}, c chan bool) {
	    go func() {
	    	     c <-i(k, v)
	    }()
}

func (f Iteration) Each(c interface{}) {
	    switch c := ValueOf(c); c.Kind() {
	    case Slice:	 	     WaitAll(c.Len(), SignalSource(func(done chan bool) {
	    	     	    	   	   	     for i := 0; i < c.Len(); i++ {
	    	     	    	   	   	     	     f.apply(i, c.Elem(i).Interface(), done) }}))

	   case Map:	     	    WaitAll(c.Len(), SignalSource(func(done chan bool) {
	   	    	   	     	    	   for _, k := range c.Keys() {
	   	    	   	     	    	   	    f.apply(k, c.Elem(k).Interface(), done) }}))
	   }
}
type Iteration func(k, x interface{}) bool

func (i Iteration) apply(k, v interface{}, c chan bool) {
	    go func() {
	    	     c <-i(k, v)
	    }()
}

func (f Iteration) Each(c interface{}) {
	    switch c := ValueOf(c); c.Kind() {
	    case Slice:	 	     WaitAll(c.Len(), SignalSource(func(done chan bool) {
	    	     	    	   	   	     for i := 0; i < c.Len(); i++ {
	    	     	    	   	   	     	     f.apply(i, c.Elem(i).Interface(), done) }}))

	   case Map:	     	    WaitAll(c.Len(), SignalSource(func(done chan bool) {
	   	    	   	     	    	   for _, k := range c.Keys() {
	   	    	   	     	    	   	    f.apply(k, c.Elem(k).Interface(), done) }}))
	   }
}
type Iteration func(k, x interface{}) bool

func (i Iteration) apply(k, v interface{}, c chan bool) {
	    go func() {
	    	     c <-i(k, v)
	    }()
}

func (f Iteration) Each(c interface{}) {
	    switch c := ValueOf(c); c.Kind() {
	    case Slice:	 	     WaitAll(c.Len(), SignalSource(func(done chan bool) {
	    	     	    	   	   	     for i := 0; i < c.Len(); i++ {
	    	     	    	   	   	     	     f.apply(i, c.Elem(i).Interface(), done) }}))

	   case Map:	     	    WaitAll(c.Len(), SignalSource(func(done chan bool) {
	   	    	   	     	    	   for _, k := range c.Keys() {
	   	    	   	     	    	   	    f.apply(k, c.Elem(k).Interface(), done) }}))
	   }
}
type Iteration func(k, x interface{}) bool

func (i Iteration) apply(k, v interface{}, c chan bool) {
	    go func() {
	    	     c <-i(k, v)
	    }()
}

func (f Iteration) Each(c interface{}) {
	    switch c := ValueOf(c); c.Kind() {
	    case Slice:	 	     WaitAll(c.Len(), SignalSource(func(done chan bool) {
	    	     	    	   	   	     for i := 0; i < c.Len(); i++ {
	    	     	    	   	   	     	     f.apply(i, c.Elem(i).Interface(), done) }}))

	   case Map:	     	    WaitAll(c.Len(), SignalSource(func(done chan bool) {
	   	    	   	     	    	   for _, k := range c.Keys() {
	   	    	   	     	    	   	    f.apply(k, c.Elem(k).Interface(), done) }}))
	   }
}
type Iteration func(k, x interface{}) bool

func (i Iteration) apply(k, v interface{}, c chan bool) {
	    go func() {
	    	     c <-i(k, v)
	    }()
}

func (f Iteration) Each(c interface{}) {
	    switch c := ValueOf(c); c.Kind() {
	    case Slice:	 	     WaitAll(c.Len(), SignalSource(func(done chan bool) {
	    	     	    	   	   	     for i := 0; i < c.Len(); i++ {
	    	     	    	   	   	     	     f.apply(i, c.Elem(i).Interface(), done) }}))

	   case Map:	     	    WaitAll(c.Len(), SignalSource(func(done chan bool) {
	   	    	   	     	    	   for _, k := range c.Keys() {
	   	    	   	     	    	   	    f.apply(k, c.Elem(k).Interface(), done) }}))
	   }
}
type Iteration func(k, x interface{}) bool

func (i Iteration) apply(k, v interface{}, c chan bool) {
	    go func() {
	    	     c <-i(k, v)
	    }()
}

func (f Iteration) Each(c interface{}) {
	    switch c := ValueOf(c); c.Kind() {
	    case Slice:	 	     WaitAll(c.Len(), SignalSource(func(done chan bool) {
	    	     	    	   	   	     for i := 0; i < c.Len(); i++ {
	    	     	    	   	   	     	     f.apply(i, c.Elem(i).Interface(), done) }}))

	   case Map:	     	    WaitAll(c.Len(), SignalSource(func(done chan bool) {
	   	    	   	     	    	   for _, k := range c.Keys() {
	   	    	   	     	    	   	    f.apply(k, c.Elem(k).Interface(), done) }}))
	   }
}
type Results chan interface{}

type Combination func(x, y interface{}) interface{}

func (f Combination) Reduce(c, s interface{}) (r Results) {
	    r = make(Results)
	    go func() {
	    	    Iteration(func(k, x interface{}) bool {
	    	    	     s = f(s, x)
	    	    	     return true
	    	    }).Each(c)
	    	    r <- s
	    }()
	    return
}
type Results chan interface{}

type Combination func(x, y interface{}) interface{}

func (f Combination) Reduce(c, s interface{}) (r Results) {
	    r = make(Results)
	    go func() {
	    	    Iteration(func(k, x interface{}) bool {
	    	    	     s = f(s, x)
	    	    	     return true
	    	    }).Each(c)
	    	    r <- s
	    }()
	    return
}
type Results chan interface{}

type Combination func(x, y interface{}) interface{}

func (f Combination) Reduce(c, s interface{}) (r Results) {
	    r = make(Results)
	    go func() {
	    	    Iteration(func(k, x interface{}) bool {
	    	    	     s = f(s, x)
	    	    	     return true
	    	    }).Each(c)
	    	    r <- s
	    }()
	    return
}
type Results chan interface{}

type Combination func(x, y interface{}) interface{}

func (f Combination) Reduce(c, s interface{}) (r Results) {
	    r = make(Results)
	    go func() {
	    	    Iteration(func(k, x interface{}) bool {
	    	    	     s = f(s, x)
	    	    	     return true
	    	    }).Each(c)
	    	    r <- s
	    }()
	    return
}
type Results chan interface{}

type Combination func(x, y interface{}) interface{}

func (f Combination) Reduce(c, s interface{}) (r Results) {
	    r = make(Results)
	    go func() {
	    	    Iteration(func(k, x interface{}) bool {
	    	    	     s = f(s, x)
	    	    	     return true
	    	    }).Each(c)
	    	    r <- s
	    }()
	    return
}
type Results chan interface{}

type Combination func(x, y interface{}) interface{}

func (f Combination) Reduce(c, s interface{}) (r Results) {
	    r = make(Results)
	    go func() {
	    	    Iteration(func(k, x interface{}) bool {
	    	    	     s = f(s, x)
	    	    	     return true
	    	    }).Each(c)
	    	    r <- s
	    }()
	    return
}
type Results chan interface{}

type Combination func(x, y interface{}) interface{}

func (f Combination) Reduce(c, s interface{}) (r Results) {
	    r = make(Results)
	    go func() {
	    	    Iteration(func(k, x interface{}) bool {
	    	    	     s = f(s, x)
	    	    	     return true
	    	    }).Each(c)
	    	    r <- s
	    }()
	    return
}
type Results chan interface{}

type Combination func(x, y interface{}) interface{}

func (f Combination) Reduce(c, s interface{}) (r Results) {
	    r = make(Results)
	    go func() {
	    	    Iteration(func(k, x interface{}) bool {
	    	    	     s = f(s, x)
	    	    	     return true
	    	    }).Each(c)
	    	    r <- s
	    }()
	    return
}
type Results chan interface{}

type Combination func(x, y interface{}) interface{}

func (f Combination) Reduce(c, s interface{}) (r Results) {
	    r = make(Results)
	    go func() {
	    	    Iteration(func(k, x interface{}) bool {
	    	    	     s = f(s, x)
	    	    	     return true
	    	    }).Each(c)
	    	    r <- s
	    }()
	    return
}
type Results chan interface{}

type Combination func(x, y interface{}) interface{}

func (f Combination) Reduce(c, s interface{}) (r Results) {
	    r = make(Results)
	    go func() {
	    	    Iteration(func(k, x interface{}) bool {
	    	    	     s = f(s, x)
	    	    	     return true
	    	    }).Each(c)
	    	    r <- s
	    }()
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
type Transformation func(x interface{}) interface{}

func (t Transformation) Transform(x interface{}) Value {
	    return ValueOf(t(x))
}

func (t Transformation) Map(c interface{}) (r interface{}) {
	    r = Allocate(c)
	    if i := MapIterator(r); i != nil {
	    	      i.Each(c)
	    }
	    return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func MapIterator(c interface{}) (i Iteration) {
	    switch n := ValueOf(c); n.Kind() {
	    case Slice:	 	     i = Iteration(func(k, x interface{}) bool {
	    	    	    	    	   	     n.Elem(k.(int)).SetValue(t.GetValue(x))
	    	    	    	    	   	     return true
	    	    	    	    	   })

	   case Map:	     	   i = Iteration(func(k, x interface{}) bool {
	   	    	   	     	   	     n.SetMapIndex(ValueOf(k), t.GetValue(x))
	   	    	   	     	   	     return true
	   	    	   	     	   })
	   }
	   return
}
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
func main() {
	    s := []int{0, 1, 2, 3, 4, 5}
	    d := Transformation(func(x interface{}) interface{} {
	    	     return x.(int) * 2
	    }).Map(s)
	    sum := Combination(func(x, y interface{}) interface{} {
	    	     return x.(int) + y.(int)
	    })
	    fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0))
	    fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0))
}




                                                 produces:
                                                    s = [0 1 2 3 4 5], sum = 15
                                                    d = [0 2 4 6 8 10], sum = 30
ruby can do that!
channels with atomic queues and thread variables
require 'socket'
require 'thread'

class ThreadGroup
	    def all_but_me &block
	    	    list. delete_if { |t|
	    	    	     t.name == Thread.current.name
	    	    }.each { |t| yield t }
	    end

	     def select *names, &block
	     	    list.delete_if { |t|
	     	    	     !names.include? t.name
	     	    }.each { |t| yield t }
	     end
end
class Thread
	     def initialize
	     	     self[:Q] = Queue.new
	     end

	    def send *messages
	    	     messages.each { |m| self[:Q].enq m }
	    end

	    def bind_transmitter socket
	    	     key? :XMIT ? raise ArgumentError : self[:XMIT] = Thread.new() {
	    	     	    loop do
	    	     	    	     (m = self[:Q].deq) == :EXIT ? Thread.current.exit : socket.puts m
	    	     	    	     Thread.pass
	    	     	    end
	    	     	    socket.close
	    	     	    exit
	    	     }
	    end

	   def disconnect
	   	     send "Goodbye #{name}", :EXIT
	   end
end
class ChatServer < TCPServer
	     def initialize port
	     	     @receivers = ThreadGroup.new
	     	     @transmitters = ThreadGroup.new
	     	     @deceased = ThreadGroup.new super
	     end

	    def register name, socket
	    	     @receivers.add(t = Thread.current)
	    	     t.name = name
	    	     @transmitters.add t.bind_transmitter(socket)
	    	     broadcast "#{name} has joined the conversation"
	    	     t.send "Welcome #{name}"
	    end

	    def connect socket
	    	     loop do
	    	     	     begin
	    	     	     	     socket.print "Please enter your name: "
	    	     	     	     register socket.readline.chomp).downcase, socket
	    	     	     	     break
	    	     	     rescue ArgumentError
	    	     	     	     socket.puts "That name is already in use"
	    	     	     end
	    	     end
	    end
def send message, name = Thread.current.name
	   	    @receivers.select(name) { |t| t.send message }
	   end

	   def broadcast message
	   	    @receivers.all_but_me { |t| t.send message }
	   end

	   def listen socket t = Thread.current
	   	     loop do
	   	     	    message = socket.readline.chomp
	   	     	    case message.downcase
	   	     	    when "bye":	 	     raise EOFError
	   	     	    when "known":	 list_known_users
	   	     	    when "quit":	 	    raise SystemExit
	   	     	    else	 	   	   	    broadcast "#{t.name}: #{message}"
	   	     	    end
	   	     end
	   end
def run
	     	    while socket = accept
	     	    Thread.new(socket) do |socket|
	     	    	    begin
	     	    	    	    connect socket
	     	    	    	    listen socket
	     	    	    rescue SystemExit
	     	    	    	    broadcast "#{Thread.current.name} terminated this conversation"
	     	    	    	    broadcast :EXIT
	     	    	    	    send :EXIT
	     	    	    	    @receivers.all_but_me { |t| t.transmitter.join }
	     	    	    	    	    Kernel.exit 0
	     	    	    	    rescue EOFError
	     	    	    	    	    disconnect
	     	    	    	    end
	     	    	    end
	     	    end
	     end
end

ChatServer.new(3939).run
great artists steal
the Thompson-Pike approach to legacy C assimilation
include $(GOROOT)/src/Make.inc

TARG=sqlite3

CGOFILES=
	   sqlite3.go
	   database.go

ifeq ($(GOOS),darwin)
CGO_LDFLAGS=/usr/lib/libsqlite3.0.dylib
else
CGO_LDFLAGS=-lsqlite3
endif

include $(GOROOT)/src/Make.pkg
include $(GOROOT)/src/Make.inc

TARG=sqlite3

CGOFILES=
	   sqlite3.go
	   database.go

ifeq ($(GOOS),darwin)
CGO_LDFLAGS=/usr/lib/libsqlite3.0.dylib
else
CGO_LDFLAGS=-lsqlite3
endif

include $(GOROOT)/src/Make.pkg
include $(GOROOT)/src/Make.inc

TARG=sqlite3

CGOFILES=
	   sqlite3.go
	   database.go

ifeq ($(GOOS),darwin)
CGO_LDFLAGS=/usr/lib/libsqlite3.0.dylib
else
CGO_LDFLAGS=-lsqlite3
endif

include $(GOROOT)/src/Make.pkg
include $(GOROOT)/src/Make.inc

TARG=sqlite3

CGOFILES=
	   sqlite3.go
	   database.go

ifeq ($(GOOS),darwin)
CGO_LDFLAGS=/usr/lib/libsqlite3.0.dylib
else
CGO_LDFLAGS=-lsqlite3
endif

include $(GOROOT)/src/Make.pkg
include $(GOROOT)/src/Make.inc

TARG=sqlite3

CGOFILES=
	   sqlite3.go
	   database.go

ifeq ($(GOOS),darwin)
CGO_LDFLAGS=/usr/lib/libsqlite3.0.dylib
else
CGO_LDFLAGS=-lsqlite3
endif

include $(GOROOT)/src/Make.pkg
package sqlite3

// #include <sqlite3.h>
import "C"
import "fmt"
import "os"

type Database struct {
	    handle	 	     	   	    *C.sqlite3
	    Filename		    	   string
	    Flags	   	    	   	    C.int
}

func (db *Database) Error() os.Error {
	    return Errno(C.sqlite3_errcode(db.handle))
}
package sqlite3

// #include <sqlite3.h>
import "C"
import "fmt"
import "os"

type Database struct {
	    handle	 	     	   	    *C.sqlite3
	    Filename		    	   string
	    Flags	   	    	   	    C.int
}

func (db *Database) Error() os.Error {
	    return Errno(C.sqlite3_errcode(db.handle))
}
package sqlite3

// #include <sqlite3.h>
import "C"
import "fmt"
import "os"

type Database struct {
	    handle	 	     	   *C.sqlite3
	    Filename		    	   string
	    Flags	   	    	   C.int
}

func (db *Database) Error() os.Error {
	    return Errno(C.sqlite3_errcode(db.handle))
}
package sqlite3

// #include <sqlite3.h>
import "C"
import "fmt"
import "os"

type Database struct {
	    handle	 	     	   *C.sqlite3
	    Filename		    	   string
	    Flags	   	    	   C.int
}

func (db *Database) Error() os.Error {
	    return Errno(C.sqlite3_errcode(db.handle))
}
package sqlite3

// #include <sqlite3.h>
import "C"
import "fmt"
import "os"

type Database struct {
	    handle	 	     	   *C.sqlite3
	    Filename		    	   string
	    Flags	   	    	   C.int
}

func (db *Database) Error() os.Error {
	    return Errno(C.sqlite3_errcode(db.handle))
}
package sqlite3

// #include <sqlite3.h>
import "C"
import "fmt"
import "os"

type Database struct {
	    handle	 	     	   *C.sqlite3
	    Filename		    	   string
	    Flags	   	    	   C.int
}

func (db *Database) Error() os.Error {
	    return Errno(C.sqlite3_errcode(db.handle))
}
package sqlite3

// #include <sqlite3.h>
import "C"
import "fmt"
import "os"

type Database struct {
	    handle	 	     	   *C.sqlite3
	    Filename		    	   string
	    Flags	   	    	   C.int
}

func (db *Database) Error() os.Error {
	    return Errno(C.sqlite3_errcode(db.handle))
}
const(
	   OK	 	  	  = Errno(iota)
	   ERROR
	   CANTOPEN	 = Errno(14)
)

var errText = map[Errno]string {
	    ERROR: 	 	   "SQL error or missing database",
	    CANTOPEN:	 "Unable to open the database file",
}

type Errno int

func (e Errno) String() (err string) {
	    if err = errText[e]; err == "" {
	    	     err = fmt.Sprintf("errno %v", int(e))
	    }
	    return
}
const(
	   OK	 	  	  = Errno(iota)
	   ERROR
	   CANTOPEN	 = Errno(14)
)

var errText = map[Errno]string {
	    ERROR: 	 	   "SQL error or missing database",
	    CANTOPEN:	 "Unable to open the database file",
}

type Errno int

func (e Errno) String() (err string) {
	    if err = errText[e]; err == "" {
	    	     err = fmt.Sprintf("errno %v", int(e))
	    }
	    return
}
const(
	   OK	 	  	  = Errno(iota)
	   ERROR
	   CANTOPEN	 = Errno(14)
)

var errText = map[Errno]string {
	    ERROR: 	 	   "SQL error or missing database",
	    CANTOPEN:	 "Unable to open the database file",
}

type Errno int

func (e Errno) String() (err string) {
	    if err = errText[e]; err == "" {
	    	     err = fmt.Sprintf("errno %v", int(e))
	    }
	    return
}
const(
	   OK	 	  	  = Errno(iota)
	   ERROR
	   CANTOPEN	 = Errno(14)
)

var errText = map[Errno]string {
	    ERROR: 	 	   "SQL error or missing database",
	    CANTOPEN:	 "Unable to open the database file",
}

type Errno int

func (e Errno) String() (err string) {
	    if err = errText[e]; err == "" {
	    	     err = fmt.Sprintf("errno %v", int(e))
	    }
	    return
}
const(
	   OK	 	  	  = Errno(iota)
	   ERROR
	   CANTOPEN	 = Errno(14)
)

var errText = map[Errno]string {
	    ERROR: 	 	   "SQL error or missing database",
	    CANTOPEN:	 "Unable to open the database file",
}

type Errno int

func (e Errno) String() (err string) {
	    if err = errText[e]; err == "" {
	    	     err = fmt.Sprintf("errno %v", int(e))
	    }
	    return
}
const(
	   OK	 	  	  = Errno(iota)
	   ERROR
	   CANTOPEN	 = Errno(14)
)

var errText = map[Errno]string {
	    ERROR: 	 	   "SQL error or missing database",
	    CANTOPEN:	 "Unable to open the database file",
}

type Errno int

func (e Errno) String() (err string) {
	    if err = errText[e]; err == "" {
	    	     err = fmt.Sprintf("errno %v", int(e))
	    }
	    return
}
const(
	   OK	 	  	  = Errno(iota)
	   ERROR
	   CANTOPEN	 = Errno(14)
)

var errText = map[Errno]string {
	    ERROR: 	 	   "SQL error or missing database",
	    CANTOPEN:	 "Unable to open the database file",
}

type Errno int

func (e Errno) String() (err string) {
	    if err = errText[e]; err == "" {
	    	     err = fmt.Sprintf("errno %v", int(e))
	    }
	    return
}
const(
	   OK	 	  	  = Errno(iota)
	   ERROR
	   CANTOPEN	 = Errno(14)
)

var errText = map[Errno]string {
	    ERROR: 	 	   "SQL error or missing database",
	    CANTOPEN:	 "Unable to open the database file",
}

type Errno int

func (e Errno) String() (err string) {
	    if err = errText[e]; err == "" {
	    	     err = fmt.Sprintf("errno %v", int(e))
	    }
	    return
}
const(
	   OK	 	  	  = Errno(iota)
	   ERROR
	   CANTOPEN	 = Errno(14)
)

var errText = map[Errno]string {
	    ERROR: 	 	   "SQL error or missing database",
	    CANTOPEN:	 "Unable to open the database file",
}

type Errno int

func (e Errno) String() (err string) {
	    if err = errText[e]; err == "" {
	    	     err = fmt.Sprintf("errno %v", int(e))
	    }
	    return
}
const(
	   OK	 	  	  = Errno(iota)
	   ERROR
	   CANTOPEN	 = Errno(14)
)

var errText = map[Errno]string {
	    ERROR: 	 	   "SQL error or missing database",
	    CANTOPEN:	 "Unable to open the database file",
}

type Errno int

func (e Errno) String() (err string) {
	    if err = errText[e]; err == "" {
	    	     err = fmt.Sprintf("errno %v", int(e))
	    }
	    return
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func (db *Database) Open(flags... int) (e os.Error) {
	    db.Flags = 0
	    for _, v := range flags {
	    	     db.Flags = db.Flags | C.int(v)
	    }
	    f := C.CString(db.Filename)
	    if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK {
	    	     e = err
	    } else if db.handle == nil {
	    	     e = CANTOPEN
	    }
	    return
}

func (db *Database) Close() {
	    C.sqlite3_close(db.handle)
	    db.handle = nil
}
func Open(filename string, flags... int) (db *Database, e os.Error) {
	    defer func() {
	    	     if x := recover(); x != nil {
	    	     	     db.Close()
	    	     	     db = nil
	    	     	     e = ERROR
	    	     }
	    }()
	    db = &Database{ Filename: filename }
	    if len(flags) == 0 {
	    	     e = db.Open(	 	      C.SQLITE_OPEN_FULLMUTEX,
	    	     	     	    	    	    C.SQLITE_OPEN_READWRITE,
	    	     	     	    	    	    C.SQLITE_OPEN_CREATE )
	    } else {
	    	     e = db.Open(flags...)
	    }
	    return
}
func Open(filename string, flags... int) (db *Database, e os.Error) {
	    defer func() {
	    	     if x := recover(); x != nil {
	    	     	     db.Close()
	    	     	     db = nil
	    	     	     e = ERROR
	    	     }
	    }()
	    db = &Database{ Filename: filename }
	    if len(flags) == 0 {
	    	     e = db.Open(	 	      C.SQLITE_OPEN_FULLMUTEX,
	    	     	     	    	    	    C.SQLITE_OPEN_READWRITE,
	    	     	     	    	    	    C.SQLITE_OPEN_CREATE )
	    } else {
	    	     e = db.Open(flags...)
	    }
	    return
}
func Open(filename string, flags... int) (db *Database, e os.Error) {
	    defer func() {
	    	     if x := recover(); x != nil {
	    	     	     db.Close()
	    	     	     db = nil
	    	     	     e = ERROR
	    	     }
	    }()
	    db = &Database{ Filename: filename }
	    if len(flags) == 0 {
	    	     e = db.Open(	 	      C.SQLITE_OPEN_FULLMUTEX,
	    	     	     	    	    	    C.SQLITE_OPEN_READWRITE,
	    	     	     	    	    	    C.SQLITE_OPEN_CREATE )
	    } else {
	    	     e = db.Open(flags...)
	    }
	    return
}
func Open(filename string, flags... int) (db *Database, e os.Error) {
	    defer func() {
	    	     if x := recover(); x != nil {
	    	     	     db.Close()
	    	     	     db = nil
	    	     	     e = ERROR
	    	     }
	    }()
	    db = &Database{ Filename: filename }
	    if len(flags) == 0 {
	    	     e = db.Open(	 	      C.SQLITE_OPEN_FULLMUTEX,
	    	     	     	    	    	    C.SQLITE_OPEN_READWRITE,
	    	     	     	    	    	    C.SQLITE_OPEN_CREATE )
	    } else {
	    	     e = db.Open(flags...)
	    }
	    return
}
func Open(filename string, flags... int) (db *Database, e os.Error) {
	    defer func() {
	    	     if x := recover(); x != nil {
	    	     	     db.Close()
	    	     	     db = nil
	    	     	     e = ERROR
	    	     }
	    }()
	    db = &Database{ Filename: filename }
	    if len(flags) == 0 {
	    	     e = db.Open(	 	      C.SQLITE_OPEN_FULLMUTEX,
	    	     	     	    	    	    C.SQLITE_OPEN_READWRITE,
	    	     	     	    	    	    C.SQLITE_OPEN_CREATE )
	    } else {
	    	     e = db.Open(flags...)
	    }
	    return
}
func Open(filename string, flags... int) (db *Database, e os.Error) {
	    defer func() {
	    	     if x := recover(); x != nil {
	    	     	     db.Close()
	    	     	     db = nil
	    	     	     e = ERROR
	    	     }
	    }()
	    db = &Database{ Filename: filename }
	    if len(flags) == 0 {
	    	     e = db.Open(	 	      C.SQLITE_OPEN_FULLMUTEX,
	    	     	     	    	    	    C.SQLITE_OPEN_READWRITE,
	    	     	     	    	    	    C.SQLITE_OPEN_CREATE )
	    } else {
	    	     e = db.Open(flags...)
	    }
	    return
}
func Open(filename string, flags... int) (db *Database, e os.Error) {
	    defer func() {
	    	     if x := recover(); x != nil {
	    	     	     db.Close()
	    	     	     db = nil
	    	     	     e = ERROR
	    	     }
	    }()
	    db = &Database{ Filename: filename }
	    if len(flags) == 0 {
	    	     e = db.Open(	 	      C.SQLITE_OPEN_FULLMUTEX,
	    	     	     	    	    	    C.SQLITE_OPEN_READWRITE,
	    	     	     	    	    	    C.SQLITE_OPEN_CREATE )
	    } else {
	    	     e = db.Open(flags...)
	    }
	    return
}
func Open(filename string, flags... int) (db *Database, e os.Error) {
	    defer func() {
	    	     if x := recover(); x != nil {
	    	     	     db.Close()
	    	     	     db = nil
	    	     	     e = ERROR
	    	     }
	    }()
	    db = &Database{ Filename: filename }
	    if len(flags) == 0 {
	    	     e = db.Open(	 	      C.SQLITE_OPEN_FULLMUTEX,
	    	     	     	    	    	    C.SQLITE_OPEN_READWRITE,
	    	     	     	    	    	    C.SQLITE_OPEN_CREATE )
	    } else {
	    	     e = db.Open(flags...)
	    }
	    return
}
package main

//	 #include "ruby.h"
import "C"
import "fmt"
import "os"

type VALUE struct {
	    cptr	*C.VALUE
}

func main() {
	    var stack_frame	 VALUE
	    defer func() { C.ruby_cleanup(0) }()

	   C.ruby_sysinit(len(os.Args), &os.Args[0])
	   C.ruby_init_stack(stack_frame.cptr)
	   C.ruby_init()
	   C.ruby_init_loadpath()
	   run_ruby()
}
package main

//	 #include "ruby.h"
import "C"
import "fmt"
import "os"

type VALUE struct {
	    cptr	*C.VALUE
}

func main() {
	    var stack_frame	 VALUE
	    defer func() { C.ruby_cleanup(0) }()

	   C.ruby_sysinit(len(os.Args), &os.Args[0])
	   C.ruby_init_stack(stack_frame.cptr)
	   C.ruby_init()
	   C.ruby_init_loadpath()
	   run_ruby()
}
package main

//	 #include "ruby.h"
import "C"
import "fmt"
import "os"

type VALUE struct {
	    cptr	*C.VALUE
}

func main() {
	    var stack_frame	 VALUE
	    defer func() { C.ruby_cleanup(0) }()

	   C.ruby_sysinit(len(os.Args), &os.Args[0])
	   C.ruby_init_stack(stack_frame.cptr)
	   C.ruby_init()
	   C.ruby_init_loadpath()
	   run_ruby()
}
package main

//	 #include "ruby.h"
import "C"
import "fmt"
import "os"

type VALUE struct {
	    cptr	*C.VALUE
}

func main() {
	    var stack_frame	 VALUE
	    defer func() { C.ruby_cleanup(0) }()

	   C.ruby_sysinit(len(os.Args), &os.Args[0])
	   C.ruby_init_stack(stack_frame.cptr)
	   C.ruby_init()
	   C.ruby_init_loadpath()
	   run_ruby()
}
package main

//	 #include "ruby.h"
import "C"
import "fmt"
import "os"

type VALUE struct {
	    cptr	*C.VALUE
}

func main() {
	    var stack_frame	 VALUE
	    defer func() { C.ruby_cleanup(0) }()

	   C.ruby_sysinit(len(os.Args), &os.Args[0])
	   C.ruby_init_stack(stack_frame.cptr)
	   C.ruby_init()
	   C.ruby_init_loadpath()
	   run_ruby()
}
package main

//	 #include "ruby.h"
import "C"
import "fmt"
import "os"

type VALUE struct {
	    cptr	*C.VALUE
}

func main() {
	    var stack_frame	 VALUE
	    defer func() { C.ruby_cleanup(0) }()

	   C.ruby_sysinit(len(os.Args), &os.Args[0])
	   C.ruby_init_stack(stack_frame.cptr)
	   C.ruby_init()
	   C.ruby_init_loadpath()
	   run_ruby()
}
package main

//	 #include "ruby.h"
import "C"
import "fmt"
import "os"

type VALUE struct {
	    cptr	*C.VALUE
}

func main() {
	    var stack_frame	 VALUE
	    defer func() { C.ruby_cleanup(0) }()

	   C.ruby_sysinit(len(os.Args), &os.Args[0])
	   C.ruby_init_stack(stack_frame.cptr)
	   C.ruby_init()
	   C.ruby_init_loadpath()
	   run_ruby()
}
package main

//	 #include "ruby.h"
import "C"
import "fmt"
import "os"

type VALUE struct {
	    cptr	*C.VALUE
}

func main() {
	    var stack_frame	 VALUE
	    defer func() { C.ruby_cleanup(0) }()

	   C.ruby_sysinit(len(os.Args), &os.Args[0])
	   C.ruby_init_stack(stack_frame.cptr)
	   C.ruby_init()
	   C.ruby_init_loadpath()
	   run_ruby()
}
func run_ruby() {
	    C.rb_require("sum.rb")
	    C.rb_eval_string("$summer = Summer.new")
	    C.rb_eval_string("$result = $summer.sum(10)")
	    result := C.rb_gv_get("result")
	    fmt.Printf("Result = %vn", C.NUM2INT(result))
}
homework
homework
embedded your favourite ruby in go
homework
embedded your favourite ruby in go
you’ll need a dynamic shared library
homework
embedded your favourite ruby in go
you’ll need a dynamic shared library
the Ruby header files
homework
embedded your favourite ruby in go
you’ll need a dynamic shared library
and the Ruby header files
the non-gcc go toolchain
homework
embedded your favourite ruby in go
you’ll need a dynamic shared library
and the Ruby header files
the non-gcc go toolchain
and some code that looks a bit like this...
finding out more
golang.org
finding out more
golang.org
#golang
finding out more
golang.org
#golang
pledgie.com/accounts/@feyeleanor
finding out more
golang.org
#golang
pledgie.com/accounts/@feyeleanor
github.com/feyeleanor
finding out more
golang.org
#golang
pledgie.com/accounts/@feyeleanor
github.com/feyeleanor
slides.games-with-brains.net

More Related Content

KEY
Google Go For Ruby Hackers
KEY
Pharo, an innovative and open-source Smalltalk
KEY
jRuby: The best of both worlds
KEY
EventMachine for RubyFuZa 2012
PDF
Steady with ruby
PDF
Kotlin on Android: Delegate with pleasure
PDF
Object Orientation vs Functional Programming in Python
PDF
Lucio Floretta - TensorFlow and Deep Learning without a PhD - Codemotion Mila...
Google Go For Ruby Hackers
Pharo, an innovative and open-source Smalltalk
jRuby: The best of both worlds
EventMachine for RubyFuZa 2012
Steady with ruby
Kotlin on Android: Delegate with pleasure
Object Orientation vs Functional Programming in Python
Lucio Floretta - TensorFlow and Deep Learning without a PhD - Codemotion Mila...

What's hot (20)

KEY
Erlang bootstrap course
PDF
Advanced Python, Part 1
PDF
Introduction to Ruby Programming Language
KEY
Lecture on Rubinius for Compiler Construction at University of Twente
KEY
ddd+scala
PDF
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
PDF
CoffeeScript
PDF
Designing Ruby APIs
PDF
Python Puzzlers
PDF
Kotlin으로 안드로이드 개발하기
PDF
Ruby basics
PDF
Kotlin, 어떻게 동작하나요
PDF
Groovy 2.0 webinar
PDF
Lift off with Groovy 2 at JavaOne 2013
PPT
Scala presentation by Aleksandar Prokopec
PDF
Privet Kotlin (Windy City DevFest)
PDF
Peyton jones-2009-fun with-type_functions-slide
PDF
Swift for TensorFlow - CoreML Personalization
PDF
F# delight
PPTX
Groovy closures
Erlang bootstrap course
Advanced Python, Part 1
Introduction to Ruby Programming Language
Lecture on Rubinius for Compiler Construction at University of Twente
ddd+scala
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
CoffeeScript
Designing Ruby APIs
Python Puzzlers
Kotlin으로 안드로이드 개발하기
Ruby basics
Kotlin, 어떻게 동작하나요
Groovy 2.0 webinar
Lift off with Groovy 2 at JavaOne 2013
Scala presentation by Aleksandar Prokopec
Privet Kotlin (Windy City DevFest)
Peyton jones-2009-fun with-type_functions-slide
Swift for TensorFlow - CoreML Personalization
F# delight
Groovy closures
Ad

Similar to Go &lt;-> Ruby (20)

KEY
GoLightly: Building VM-Based Language Runtimes with Google Go
PPTX
Chapter 2 Python Language Basics, IPython.pptx
PPTX
GE8151 Problem Solving and Python Programming
PDF
A Recovering Java Developer Learns to Go
PDF
A Few of My Favorite (Python) Things
PPTX
golang_getting_started.pptx
PDF
Intro to Python
PDF
Introduction to Python
PDF
Python basic
PPTX
Chapter 02 functions -class xii
PDF
The Swift Compiler and Standard Library
PDF
Idioms in swift 2016 05c
PPT
C463_02_python.ppt,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
PPT
C463_02intoduction_to_python_to learnGAI.ppt
DOCX
C cheat sheet for varsity (extreme edition)
PDF
A Sceptical Guide to Functional Programming
PPTX
PPTX
Using-Python-Libraries.9485146.powerpoint.pptx
PDF
Ruby - Uma Introdução
PDF
Are we ready to Go?
GoLightly: Building VM-Based Language Runtimes with Google Go
Chapter 2 Python Language Basics, IPython.pptx
GE8151 Problem Solving and Python Programming
A Recovering Java Developer Learns to Go
A Few of My Favorite (Python) Things
golang_getting_started.pptx
Intro to Python
Introduction to Python
Python basic
Chapter 02 functions -class xii
The Swift Compiler and Standard Library
Idioms in swift 2016 05c
C463_02_python.ppt,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
C463_02intoduction_to_python_to learnGAI.ppt
C cheat sheet for varsity (extreme edition)
A Sceptical Guide to Functional Programming
Using-Python-Libraries.9485146.powerpoint.pptx
Ruby - Uma Introdução
Are we ready to Go?
Ad

More from Eleanor McHugh (20)

PDF
Go for the Paranoid Network Programmer, 2025 Edition
PDF
Y - Recursion The Hard Way GopherCon EU 2025
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
Generics, Reflection, and Efficient Collections
PDF
The Relevance of Liveness - Biometrics and Data Integrity
PDF
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
PDF
The Browser Environment - A Systems Programmer's Perspective
PDF
Go for the paranoid network programmer, 3rd edition
PDF
An introduction to functional programming with Go [redux]
PDF
An introduction to functional programming with go
PDF
Implementing virtual machines in go & c 2018 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
Going Loopy - Adventures in Iteration with Google Go
PDF
Distributed Ledgers: Anonymity & Immutability at Scale
PDF
Hello Go
Go for the Paranoid Network Programmer, 2025 Edition
Y - Recursion The Hard Way GopherCon EU 2025
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
Generics, Reflection, and Efficient Collections
The Relevance of Liveness - Biometrics and Data Integrity
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
The Browser Environment - A Systems Programmer's Perspective
Go for the paranoid network programmer, 3rd edition
An introduction to functional programming with Go [redux]
An introduction to functional programming with go
Implementing virtual machines in go & c 2018 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
Going Loopy - Adventures in Iteration with Google Go
Distributed Ledgers: Anonymity & Immutability at Scale
Hello Go

Recently uploaded (20)

PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Encapsulation theory and applications.pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
sap open course for s4hana steps from ECC to s4
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPT
Teaching material agriculture food technology
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Machine learning based COVID-19 study performance prediction
Digital-Transformation-Roadmap-for-Companies.pptx
Network Security Unit 5.pdf for BCA BBA.
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Encapsulation theory and applications.pdf
Empathic Computing: Creating Shared Understanding
Reach Out and Touch Someone: Haptics and Empathic Computing
Spectral efficient network and resource selection model in 5G networks
sap open course for s4hana steps from ECC to s4
The Rise and Fall of 3GPP – Time for a Sabbatical?
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Encapsulation_ Review paper, used for researhc scholars
Diabetes mellitus diagnosis method based random forest with bat algorithm
Programs and apps: productivity, graphics, security and other tools
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Understanding_Digital_Forensics_Presentation.pptx
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Teaching material agriculture food technology
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Machine learning based COVID-19 study performance prediction

Go &lt;-> Ruby

  • 1. Go <=> Ruby a selection of odd lightning talks @feyeleanor http://slides.games-with-brains.net/
  • 2. The Wild-Eyed Screamer
  • 9. Hacker 101 this presentation contains code that code is probably broken
  • 10. Hacker 101 this presentation contains code that code is probably broken if this bothers you - fix it
  • 11. Hacker 101 this presentation contains code that code is probably broken if this bothers you - fix it it’s called a learning experience
  • 12. Hacker 101 this presentation contains code that code is probably broken if this bothers you - fix it it’s called a learning experience and will make you a better persontm
  • 13. Google Go it’s not just for Google
  • 16. of very few words
  • 17. who lives at google
  • 18. package main import "fmt" const HELLO string = "hello" var WORLD string = "world" func main() { fmt.Println(HELLO, WORLD) }
  • 19. package main import "fmt" const HELLO string = "hello" var WORLD string = "world" func main() { fmt.Println(HELLO, WORLD) }
  • 20. package main import "fmt" const HELLO string = "hello" var WORLD string = "world" func main() { fmt.Println(HELLO, WORLD) }
  • 21. package main import "fmt" const HELLO string = "hello" var WORLD string = "world" func main() { fmt.Println(HELLO, WORLD) }
  • 22. package organisation import var, const, type declaration func, interface, map, struct, chan if ... else switch ... case ... fallthrough ... default select ... case control flow for for ... range break, continue go, goto, defer, return
  • 23. boolean, numeric, array value structure, interface reference pointer, slice, string, map, channel invocation function, method, closure
  • 24. Go Ruby compilation static AOT runtime mutable memory garbage collected syntax minimalist humanistic strong dynamic type embedding inheritance dispatch procedural invocation message passing semantics statements expressions
  • 25. Ruby typing is tricksy lies we tell ourself about type
  • 26. superclass modules class modules message instance
  • 27. superclass modules class modules type asserted instance
  • 28. instance inherited class class expressed type modules
  • 29. instance inherited class class expressed type modules
  • 30. instance inherited class class expressed type modules
  • 31. instance inherited class class expressed type modules
  • 32. class Counter attr_writer :count def initialize @count = 0 end def Tick @count += 1 end end class DoubleCounter < Counter def Tick super @count += 1 end end n = new(DoubleCounter) puts n.Tick puts n.superclass.Tick
  • 33. class Counter attr_writer :count def initialize @count = 0 end def Tick @count += 1 end end class DoubleCounter < Counter def Tick super @count += 1 end end n = new(DoubleCounter) puts n.Tick puts n.superclass.Tick
  • 34. class Counter attr_writer :count def initialize @count = 0 end def Tick @count += 1 end end class DoubleCounter < Counter def Tick super @count += 1 end end n = new(DoubleCounter) puts n.Tick puts n.superclass.Tick
  • 35. class Counter attr_writer :count def initialize @count = 0 end def Tick @count += 1 end end class DoubleCounter < Counter def Tick super @count += 1 end end n = new(DoubleCounter) puts n.Tick puts n.superclass.Tick
  • 36. class Counter attr_writer :count def initialize @count = 0 end def Tick @count += 1 end end class DoubleCounter < Counter def Tick super @count += 1 end end n = new(DoubleCounter) puts n.Tick puts n.superclass.Tick
  • 37. class Counter attr_writer :count def initialize @count = 0 end def Tick @count += 1 end end class DoubleCounter < Counter def Tick super @count += 1 end end n = new(DoubleCounter) puts n.Tick puts n.superclass.Tick
  • 38. down a rabbit hole instances are their own classes
  • 39. down a rabbit hole instances are their own classes and all classes are mutable at runtime
  • 40. down a rabbit hole instances are their own classes all classes are mutable at runtime so inheritance pathways can be altered
  • 41. down a rabbit hole instances are their own classes and all classes are mutable at runtime so inheritance pathways can be altered making Ruby very flexible
  • 42. down a rabbit hole instances are their own classes and all classes are mutable at runtime so inheritance pathways can be altered making Ruby very flexible at the cost of type uncertainty
  • 43. down a rabbit hole instances are their own classes and all classes are mutable at runtime so inheritance pathways can be altered making Ruby very flexible at the cost of type uncertainty which really bugs computer scientists
  • 44. type in Go is safetm clearly defined areas of doubt and uncertainty
  • 45. memory method layout set static type embedded types
  • 46. memory method layout set static type embedded types
  • 47. memory method layout set static type embedded types
  • 48. memory method layout set static type embedded types
  • 49. package Integer type Int int func (i *Int) Add(x int) { *i += Int(x) }
  • 50. package Integer type Int int func (i *Int) Add(x int) { *i += Int(x) }
  • 51. package Integer type Int int func (i *Int) Add(x int) { *i += Int(x) }
  • 52. package Integer type Int int func (i *Int) Add(x int) { *i += Int(x) }
  • 53. type Buffer []Int func (b Buffer) Swap(i, j int) { b[i], b[j] = b[j], b[i] } func (b Buffer) Clone() Buffer { s := make(Buffer, len(b)) copy(s, b) return s } func (b Buffer) Move(i, n int) { if n > len(b) - i { n = len(b) - i } segment_to_move := b[:i].Clone() copy(b, b[i:i + n]) copy(b[n:i + n], segment_to_move) }
  • 54. type Buffer []Int func (b Buffer) Swap(i, j int) { b[i], b[j] = b[j], b[i] } func (b Buffer) Clone() Buffer { s := make(Buffer, len(b)) copy(s, b) return s } func (b Buffer) Move(i, n int) { if n > len(b) - i { n = len(b) - i } segment_to_move := b[:i].Clone() copy(b, b[i:i + n]) copy(b[n:i + n], segment_to_move) }
  • 55. type Buffer []Int func (b Buffer) Swap(i, j int) { b[i], b[j] = b[j], b[i] } func (b Buffer) Clone() Buffer { s := make(Buffer, len(b)) copy(s, b) return s } func (b Buffer) Move(i, n int) { if n > len(b) - i { n = len(b) - i } segment_to_move := b[:i].Clone() copy(b, b[i:i + n]) copy(b[n:i + n], segment_to_move) }
  • 56. package main import "fmt" import "Integer" func main() { i := Integer.Buffer{0, 1, 2, 3, 4, 5} b := i.Clone() b.Swap(1, 2) b.Move(3, 2) b[0].Add(3) produces: fmt.Printf("b[0:2] = %vn", b[:2]) b[0:2] = [6 4] }
  • 57. package main import "fmt" import "Integer" func main() { i := Integer.Buffer{0, 1, 2, 3, 4, 5} b := i.Clone() b.Swap(1, 2) b.Move(3, 2) b[0].Add(3) produces: fmt.Printf(“b[0:2] = %vn”, b[:2]) b[0:2] = [6 4] }
  • 58. package main import "fmt" import "Integer" func main() { i := Integer.Buffer{0, 1, 2, 3, 4, 5} b := i.Clone() b.Swap(1, 2) b.Move(3, 2) b[0].Add(3) produces: fmt.Printf("b[0:2] = %vn", b[:2]) b[0:2] = [6 4] }
  • 59. package main import "fmt" import "Integer" func main() { i := Integer.Buffer{0, 1, 2, 3, 4, 5} b := i.Clone() b.Swap(1, 2) b.Move(3, 2) b[0].Add(3) produces: fmt.Printf("b[0:2] = %vn", b[:2]) b[0:2] = [6 4] }
  • 60. package main import "fmt" import "Integer" func main() { i := Integer.Buffer{0, 1, 2, 3, 4, 5} b := i.Clone() b.Swap(1, 2) b.Move(3, 2) b[0].Add(3) produces: fmt.Printf("b[0:2] = %vn", b[:2]) b[0:2] = [6 4] }
  • 61. package Vector import . "Integer" type Vector struct { Buffer } func (v *Vector) Clone() *Vector { return &Vector{v.Buffer.Clone()} } func (v *Vector) Slice(i, j int) Buffer { return v.Buffer[i:j] }
  • 62. package Vector import . "Integer" type Vector struct { Buffer } func (v *Vector) Clone() *Vector { return &Vector{v.Buffer.Clone()} } func (v *Vector) Slice(i, j int) Buffer { return v.Buffer[i:j] }
  • 63. package Vector import . "Integer" type Vector struct { Buffer } func (v *Vector) Clone() *Vector { return &Vector{v.Buffer.Clone()} } func (v *Vector) Slice(i, j int) Buffer { return v.Buffer[i:j] }
  • 64. package Vector import . "Integer" type Vector struct { Buffer } func (v *Vector) Clone() *Vector { return &Vector{v.Buffer.Clone()} } func (v *Vector) Slice(i, j int) Buffer { return v.Buffer[i:j] }
  • 65. package Vector import . "Integer" type Vector struct { Buffer } func (v *Vector) Clone() *Vector { return &Vector{v.Buffer.Clone()} } func (v *Vector) Slice(i, j int) Buffer { return v.Buffer[i:j] }
  • 66. type Adder interface { Add(j int) Subtract(j int) Result() interface{} Reset() }
  • 67. type Adder interface { Add(j int) Subtract(j int) Result() interface{} Reset() }
  • 68. type Adder interface { Add(j int) Subtract(j int) Result() interface{} Reset() }
  • 69. type IAdder int func (i IAdder) Add(j int) { i[0] += i[j] } func (i IAdder) Subtract(j int) { i[0] -= i[j] } func (i IAdder) Result() interface{} { return i[0] } func (i IAdder) Reset() { i[0] = *new(int) } func (i IAdder) Increment() { i[0]++ }
  • 70. type IAdder int func (i IAdder) Add(j int) { i[0] += i[j] } func (i IAdder) Subtract(j int) { i[0] -= i[j] } func (i IAdder) Result() interface{} { return i[0] } func (i IAdder) Reset() { i[0] = *new(int) } func (i IAdder) Increment() { i[0]++ }
  • 71. type IAdder int func (i IAdder) Add(j int) { i[0] += i[j] } func (i IAdder) Subtract(j int) { i[0] -= i[j] } func (i IAdder) Result() interface{} { return i[0] } func (i IAdder) Reset() { i[0] = *new(int) } func (i IAdder) Increment() { i[0]++ }
  • 72. type FAdder []float32 func (f FAdder) Add(j int) { f[0] += f[j] } func (f FAdder) Subtract(j int) { f[0] -= f[j] } func (f FAdder) Result() interface{} { return f[0] } func (f FAdder) Reset() { f[0] = 0 }
  • 73. type FAdder []float32 func (f FAdder) Add(j int) { f[0] += f[j] } func (f FAdder) Subtract(j int) { f[0] -= f[j] } func (f FAdder) Result() interface{} { return f[0] } func (f FAdder) Reset() { f[0] = 0 }
  • 74. type FAdder []float32 func (f FAdder) Add(j int) { f[0] += f[j] } func (f FAdder) Subtract(j int) { f[0] -= f[j] } func (f FAdder) Result() interface{} { return f[0] } func (f FAdder) Reset() { f[0] = 0 }
  • 75. func TestAdder(t *testing.T) { var a Adder a = IAdder{0, 1, 2} a.Add(1) if i.Result().(int) != 1 { t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1) } a.Subtract(2) if a.Result().(int) != -1 { t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1) } a = FAdder{0.0, 1.0, 2.0} a.Add(1) if a.Result().(float32) != 1.0 { t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0) } }
  • 76. func TestAdder(t *testing.T) { var a Adder a = IAdder{0, 1, 2} a.Add(1) if i.Result().(int) != 1 { t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1) } a.Subtract(2) if a.Result().(int) != -1 { t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1) } a = FAdder{0.0, 1.0, 2.0} a.Add(1) if a.Result().(float32) != 1.0 { t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0) } }
  • 77. func TestAdder(t *testing.T) { var a Adder a = IAdder{0, 1, 2} a.Add(1) if i.Result().(int) != 1 { t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1) } a.Subtract(2) if a.Result().(int) != -1 { t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1) } a = FAdder{0.0, 1.0, 2.0} a.Add(1) if a.Result().(float32) != 1.0 { t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0) } }
  • 78. func TestAdder(t *testing.T) { var a Adder a = IAdder{0, 1, 2} a.Add(1) if i.Result().(int) != 1 { t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1) } a.Subtract(2) if a.Result().(int) != -1 { t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1) } a = FAdder{0.0, 1.0, 2.0} a.Add(1) if a.Result().(float32) != 1.0 { t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0) } }
  • 79. func TestAdder(t *testing.T) { var a Adder a = IAdder{0, 1, 2} a.Add(1) if i.Result().(int) != 1 { t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1) } a.Subtract(2) if a.Result().(int) != -1 { t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1) } a = FAdder{0.0, 1.0, 2.0} a.Add(1) if a.Result().(float32) != 1.0 { t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0) } }
  • 80. func TestAdder(t *testing.T) { var a Adder a = IAdder{0, 1, 2} a.Add(1) if i.Result().(int) != 1 { t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1) } a.Subtract(2) if a.Result().(int) != -1 { t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1) } a = FAdder{0.0, 1.0, 2.0} a.Add(1) if a.Result().(float32) != 1.0 { t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0) } }
  • 81. func TestAdder(t *testing.T) { var a Adder a = IAdder{0, 1, 2} a.Add(1) if i.Result().(int) != 1 { t.Fatalf("IAdder::Add(1) %v != %v", a.Result(), 1) } a.Subtract(2) if a.Result().(int) != -1 { t.Fatalf("IAdder::Subtract(2) %v != %v", a.Result(), -1) } a = FAdder{0.0, 1.0, 2.0} a.Add(1) if a.Result().(float32) != 1.0 { t.Fatalf("FAdder::Add(1) %v != %v", a.Result(), 1.0) } }
  • 82. down a rabbit hole an object has known static type
  • 83. down a rabbit hole an object has known static type this fixed type is determined at linking
  • 84. down a rabbit hole an object has known static type this fixed type is determined at linking no new types can be created at runtime
  • 85. down a rabbit hole an object has known static type this fixed type is determined at linking no new types can be created at runtime so dynamism is bounded to a fixed set
  • 86. down a rabbit hole an object has known static type this fixed type is determined at linking no new types can be created at runtime so dynamism is bounded to this fixed set and computer scientists are happier
  • 87. unit tests as REPL testing that doesn’t suck
  • 88. func (b Buffer) Eq(o Buffer) (r bool) { if len(b) == len(o) { for i := len(b) - 1; i > 0; i-- { if b[i] != o[i] { return } } r = true } return }
  • 89. func (b Buffer) Eq(o Buffer) (r bool) { if len(b) == len(o) { for i := len(b) - 1; i > 0; i-- { if b[i] != o[i] { return } } r = true } return }
  • 90. func (b Buffer) Eq(o Buffer) (r bool) { if len(b) == len(o) { for i := len(b) - 1; i > 0; i-- { if b[i] != o[i] { return } } r = true } return }
  • 91. func (b Buffer) Eq(o Buffer) (r bool) { if len(b) == len(o) { for i := len(b) - 1; i > 0; i-- { if b[i] != o[i] { return } } r = true } return }
  • 92. func (b Buffer) Eq(o Buffer) (r bool) { if len(b) == len(o) { for i := len(b) - 1; i > 0; i-- { if b[i] != o[i] { return } } r = true } return }
  • 93. func (b Buffer) Eq(o Buffer) (r bool) { if len(b) == len(o) { for i := len(b) - 1; i > 0; i-- { if b[i] != o[i] { return } } r = true } return }
  • 94. func (b Buffer) Eq(o Buffer) (r bool) { if len(b) == len(o) { for i := len(b) - 1; i > 0; i-- { if b[i] != o[i] { return } } r = true } return }
  • 95. package Vector import "testing" func TestVectorSwap(t *testing.T) { i := Vector{Buffer{0, 1, 2, 3, 4, 5}} v := i.Clone() v.Swap(1, 2) r := Vector{Buffer{0, 2, 1, 3, 4, 5}} switch { case !v.Eq(r.Buffer): fallthrough case !v.Buffer.Eq(r.Buffer): t.Fatalf("b[0:5] = %v", v) } }
  • 96. package Vector import "testing" func TestVectorSwap(t *testing.T) { i := Vector{Buffer{0, 1, 2, 3, 4, 5}} v := i.Clone() v.Swap(1, 2) r := Vector{Buffer{0, 2, 1, 3, 4, 5}} switch { case !v.Eq(r.Buffer): fallthrough case !v.Buffer.Eq(r.Buffer): t.Fatalf("b[0:5] = %v", v) } }
  • 97. package Vector import "testing" func TestVectorSwap(t *testing.T) { i := Vector{Buffer{0, 1, 2, 3, 4, 5}} v := i.Clone() v.Swap(1, 2) r := Vector{Buffer{0, 2, 1, 3, 4, 5}} switch { case !v.Eq(r.Buffer): fallthrough case !v.Buffer.Eq(r.Buffer): t.Fatalf("b[0:5] = %v", v) } }
  • 98. package Vector import "testing" func TestVectorSwap(t *testing.T) { i := Vector{Buffer{0, 1, 2, 3, 4, 5}} v := i.Clone() v.Swap(1, 2) r := Vector{Buffer{0, 2, 1, 3, 4, 5}} switch { case !v.Eq(r.Buffer): fallthrough case !v.Buffer.Eq(r.Buffer): t.Fatalf("b[0:5] = %v", v) } }
  • 99. package Vector import "testing" func TestVectorSwap(t *testing.T) { i := Vector{Buffer{0, 1, 2, 3, 4, 5}} v := i.Clone() v.Swap(1, 2) r := Vector{Buffer{0, 2, 1, 3, 4, 5}} switch { case !v.Eq(r.Buffer): fallthrough case !v.Buffer.Eq(r.Buffer): t.Fatalf("b[0:5] = %v", v) } }
  • 100. package Vector import "testing" func TestVectorSwap(t *testing.T) { i := Vector{Buffer{0, 1, 2, 3, 4, 5}} v := i.Clone() v.Swap(1, 2) r := Vector{Buffer{0, 2, 1, 3, 4, 5}} switch { case !v.Eq(r.Buffer): fallthrough case !v.Buffer.Eq(r.Buffer): t.Fatalf("b[0:5] = %v", v) } }
  • 101. package Vector import "testing" func TestVectorSwap(t *testing.T) { i := Vector{Buffer{0, 1, 2, 3, 4, 5}} v := i.Clone() v.Swap(1, 2) r := Vector{Buffer{0, 2, 1, 3, 4, 5}} switch { case !v.Eq(r.Buffer): fallthrough case !v.Buffer.Eq(r.Buffer): t.Fatalf("b[0:5] = %v", v) } }
  • 102. package Vector import "testing" func TestVectorSwap(t *testing.T) { i := Vector{Buffer{0, 1, 2, 3, 4, 5}} v := i.Clone() v.Swap(1, 2) r := Vector{Buffer{0, 2, 1, 3, 4, 5}} switch { case !v.Eq(r.Buffer): fallthrough case !v.Buffer.Eq(r.Buffer): t.Fatalf("b[0:5] = %v", v) } }
  • 103. include $(GOROOT)/src/Make.inc TARG=integer GOFILES= integer.go vector.go include $(GOROOT)/src/Make.pkg
  • 104. package Vector import "testing" import "vector" func BenchmarkVectorClone6(b *testing.B) { v := Vector{Buffer{0, 1, 2, 3, 4, 5}} for i := 0; i < b.N; i++ { _ = v.Clone() } } func BenchmarkVectorSwap(b *testing.B) { b.StopTimer() v := Vector{Buffer{0, 1, 2, 3, 4, 5}} b.StartTimer() for i := 0; i < b.N; i++ { v.Swap(1, 2) } }
  • 105. package Vector import "testing" import "vector" func BenchmarkVectorClone6(b *testing.B) { v := Vector{Buffer{0, 1, 2, 3, 4, 5}} for i := 0; i < b.N; i++ { _ = v.Clone() } } func BenchmarkVectorSwap(b *testing.B) { b.StopTimer() v := Vector{Buffer{0, 1, 2, 3, 4, 5}} b.StartTimer() for i := 0; i < b.N; i++ { v.Swap(1, 2) } }
  • 106. package Vector import "testing" import "vector" func BenchmarkVectorClone6(b *testing.B) { v := Vector{Buffer{0, 1, 2, 3, 4, 5}} for i := 0; i < b.N; i++ { _ = v.Clone() } } func BenchmarkVectorSwap(b *testing.B) { b.StopTimer() v := Vector{Buffer{0, 1, 2, 3, 4, 5}} b.StartTimer() for i := 0; i < b.N; i++ { v.Swap(1, 2) } }
  • 107. package Vector import "testing" import "vector" func BenchmarkVectorClone6(b *testing.B) { v := Vector{Buffer{0, 1, 2, 3, 4, 5}} for i := 0; i < b.N; i++ { _ = v.Clone() } } func BenchmarkVectorSwap(b *testing.B) { b.StopTimer() v := Vector{Buffer{0, 1, 2, 3, 4, 5}} b.StartTimer() for i := 0; i < b.N; i++ { v.Swap(1, 2) } }
  • 108. package Vector import "testing" import "vector" func BenchmarkVectorClone6(b *testing.B) { v := Vector{Buffer{0, 1, 2, 3, 4, 5}} for i := 0; i < b.N; i++ { _ = v.Clone() } } func BenchmarkVectorSwap(b *testing.B) { b.StopTimer() v := Vector{Buffer{0, 1, 2, 3, 4, 5}} b.StartTimer() for i := 0; i < b.N; i++ { v.Swap(1, 2) } }
  • 109. package Vector import "testing" import "vector" func BenchmarkVectorClone6(b *testing.B) { v := Vector{Buffer{0, 1, 2, 3, 4, 5}} for i := 0; i < b.N; i++ { _ = v.Clone() } } func BenchmarkVectorSwap(b *testing.B) { b.StopTimer() v := Vector{Buffer{0, 1, 2, 3, 4, 5}} b.StartTimer() for i := 0; i < b.N; i++ { v.Swap(1, 2) } }
  • 110. $ gotest -bench="Benchmark" rm -f _test/scripts.a 6g -o _gotest_.6 integer.go vector.go nominal_typing_test.go embedded_typing_benchmark_test.go embedded_typing_test.go rm -f _test/scripts.a gopack grc _test/scripts.a _gotest_.6 PASS integer.BenchmarkVectorSwap 200000000 8 ns/op integer.BenchmarkVectorClone6 10000000 300 ns/op
  • 111. $ gotest -bench="Benchmark" rm -f _test/scripts.a 6g -o _gotest_.6 integer.go vector.go nominal_typing_test.go embedded_typing_benchmark_test.go embedded_typing_test.go rm -f _test/scripts.a gopack grc _test/scripts.a _gotest_.6 PASS integer.BenchmarkVectorSwap 200000000 8 ns/op integer.BenchmarkVectorClone6 10000000 300 ns/op
  • 112. $ gotest -bench="Benchmark" rm -f _test/scripts.a 6g -o _gotest_.6 integer.go vector.go nominal_typing_test.go embedded_typing_benchmark_test.go embedded_typing_test.go rm -f _test/scripts.a gopack grc _test/scripts.a _gotest_.6 PASS integer.BenchmarkVectorSwap 200000000 8 ns/op integer.BenchmarkVectorClone6 10000000 300 ns/op
  • 113. $ gotest -bench="Benchmark" rm -f _test/scripts.a 6g -o _gotest_.6 integer.go vector.go nominal_typing_test.go embedded_typing_benchmark_test.go embedded_typing_test.go rm -f _test/scripts.a gopack grc _test/scripts.a _gotest_.6 PASS integer.BenchmarkVectorSwap 200000000 8 ns/op integer.BenchmarkVectorClone6 10000000 300 ns/op
  • 114. $ gotest -bench="Benchmark" rm -f _test/scripts.a 6g -o _gotest_.6 integer.go vector.go nominal_typing_test.go embedded_typing_benchmark_test.go embedded_typing_test.go rm -f _test/scripts.a gopack grc _test/scripts.a _gotest_.6 PASS integer.BenchmarkVectorSwap 200000000 8 ns/op integer.BenchmarkVectorClone6 10000000 300 ns/op
  • 115. exceptional fun because Go doesn’t have exceptions - honest!
  • 116. func Throw() { panic(nil) } func Catch(f func()) { defer func() { if x := recover(); x != nil { panic(x) } }() f() } func CatchAll(f func()) { defer func() { recover() }() f() }
  • 117. func Throw() { panic(nil) } func Catch(f func()) { defer func() { if x := recover(); x != nil { panic(x) } }() f() } func CatchAll(f func()) { defer func() { recover() }() f() }
  • 118. func Throw() { panic(nil) } func Catch(f func()) { defer func() { if x := recover(); x != nil { panic(x) } }() f() } func CatchAll(f func()) { defer func() { recover() }() f() }
  • 119. func Throw() { panic(nil) } func Catch(f func()) { defer func() { if x := recover(); x != nil { panic(x) } }() f() } func CatchAll(f func()) { defer func() { recover() }() f() }
  • 120. func Throw() { panic(nil) } func Catch(f func()) { defer func() { if x := recover(); x != nil { panic(x) } }() f() } func CatchAll(f func()) { defer func() { recover() }() f() }
  • 121. func Throw() { panic(nil) } func Catch(f func()) { defer func() { if x := recover(); x != nil { panic(x) } }() f() } func CatchAll(f func()) { defer func() { recover() }() f() }
  • 122. func Throw() { panic(nil) } func Catch(f func()) { defer func() { if x := recover(); x != nil { panic(x) } }() f() } func CatchAll(f func()) { defer func() { recover() }() f() }
  • 123. func Throw() { panic(nil) } func Catch(f func()) { defer func() { if x := recover(); x != nil { panic(x) } }() f() } func CatchAll(f func()) { defer func() { recover() }() f() }
  • 124. func Throw() { panic(nil) } func Catch(f func()) { defer func() { if x := recover(); x != nil { panic(x) } }() f() } func CatchAll(f func()) { defer func() { recover() }() f() }
  • 125. func Throw() { panic(nil) } func Catch(f func()) { defer func() { if x := recover(); x != nil { panic(x) } }() f() } func CatchAll(f func()) { defer func() { recover() }() f() }
  • 126. func throwsPanic(f func()) (b bool) { defer func() { if x := recover(); x != nil { b = true } }() f() return }
  • 127. func throwsPanic(f func()) (b bool) { defer func() { if x := recover(); x != nil { b = true } }() f() return }
  • 128. func throwsPanic(f func()) (b bool) { defer func() { if x := recover(); x != nil { b = true } }() f() return }
  • 129. func throwsPanic(f func()) (b bool) { defer func() { if x := recover(); x != nil { b = true } }() f() return }
  • 130. func throwsPanic(f func()) (b bool) { defer func() { if x := recover(); x != nil { b = true } }() f() return }
  • 131. func throwsPanic(f func()) (b bool) { defer func() { if x := recover(); x != nil { b = true } }() f() return }
  • 132. func throwsPanic(f func()) (b bool) { defer func() { if x := recover(); x != nil { b = true } }() f() return }
  • 133. func throwsPanic(f func()) (b bool) { defer func() { if x := recover(); x != nil { b = true } }() f() return }
  • 134. import "fmt" import "path" import "runtime" func StackTrace() { var stack_trace []uintptr var my_path string runtime.Callers(1, stack_trace) for i, u := range stack_trace { if f := runtime.FuncForPC(u); f != nil { file, line := f.FileLine(u) switch filepath, filename := path.Split(file); { case i == 0: my_path = filepath case my_path != filepath: fmt.Printf("%v:%v", filename, line) } } else { fmt.Println("(unknown)") } } }
  • 135. import "fmt" import "path" import "runtime" func StackTrace() { var stack_trace []uintptr var my_path string runtime.Callers(1, stack_trace) for i, u := range stack_trace { if f := runtime.FuncForPC(u); f != nil { file, line := f.FileLine(u) switch filepath, filename := path.Split(file); { case i == 0: my_path = filepath case my_path != filepath: fmt.Printf("%v:%v", filename, line) } } else { fmt.Println("(unknown)") } } }
  • 136. import "fmt" import "path" import "runtime" func StackTrace() { var stack_trace []uintptr var my_path string runtime.Callers(1, stack_trace) for i, u := range stack_trace { if f := runtime.FuncForPC(u); f != nil { file, line := f.FileLine(u) switch filepath, filename := path.Split(file); { case i == 0: my_path = filepath case my_path != filepath: fmt.Printf("%v:%v", filename, line) } } else { fmt.Println("(unknown)") } } }
  • 137. import "fmt" import "path" import "runtime" func StackTrace() { var stack_trace []uintptr var my_path string runtime.Callers(1, stack_trace) for i, u := range stack_trace { if f := runtime.FuncForPC(u); f != nil { file, line := f.FileLine(u) switch filepath, filename := path.Split(file); { case i == 0: my_path = filepath case my_path != filepath: fmt.Printf("%v:%v", filename, line) } } else { fmt.Println("(unknown)") } } }
  • 138. import "fmt" import "path" import "runtime" func StackTrace() { var stack_trace []uintptr var my_path string runtime.Callers(1, stack_trace) for i, u := range stack_trace { if f := runtime.FuncForPC(u); f != nil { file, line := f.FileLine(u) switch filepath, filename := path.Split(file); { case i == 0: my_path = filepath case my_path != filepath: fmt.Printf("%v:%v", filename, line) } } else { fmt.Println("(unknown)") } } }
  • 139. import "fmt" import "path" import "runtime" func StackTrace() { var stack_trace []uintptr var my_path string runtime.Callers(1, stack_trace) for i, u := range stack_trace { if f := runtime.FuncForPC(u); f != nil { file, line := f.FileLine(u) switch filepath, filename := path.Split(file); { case i == 0: my_path = filepath case my_path != filepath: fmt.Printf("%v:%v", filename, line) } } else { fmt.Println("(unknown)") } } }
  • 140. import "fmt" import "path" import "runtime" func StackTrace() { var stack_trace []uintptr var my_path string runtime.Callers(1, stack_trace) for i, u := range stack_trace { if f := runtime.FuncForPC(u); f != nil { file, line := f.FileLine(u) switch filepath, filename := path.Split(file); { case i == 0: my_path = filepath case my_path != filepath: fmt.Printf("%v:%v", filename, line) } } else { fmt.Println("(unknown)") } } }
  • 141. import "fmt" import "path" import "runtime" func StackTrace() { var stack_trace []uintptr var my_path string runtime.Callers(1, stack_trace) for i, u := range stack_trace { if f := runtime.FuncForPC(u); f != nil { file, line := f.FileLine(u) switch filepath, filename := path.Split(file); { case i == 0: my_path = filepath case my_path != filepath: fmt.Printf("%v:%v", filename, line) } } else { fmt.Println("(unknown)") } } }
  • 142. import "fmt" import "path" import "runtime" func StackTrace() { var stack_trace []uintptr var my_path string runtime.Callers(1, stack_trace) for i, u := range stack_trace { if f := runtime.FuncForPC(u); f != nil { file, line := f.FileLine(u) switch filepath, filename := path.Split(file); { case i == 0: my_path = filepath case my_path != filepath: fmt.Printf("%v:%v", filename, line) } } else { fmt.Println("(unknown)") } } }
  • 143. import "fmt" import "path" import "runtime" func StackTrace() { var stack_trace []uintptr var my_path string runtime.Callers(1, stack_trace) for i, u := range stack_trace { if f := runtime.FuncForPC(u); f != nil { file, line := f.FileLine(u) switch filepath, filename := path.Split(file); { case i == 0: my_path = filepath case my_path != filepath: fmt.Printf("%v:%v", filename, line) } } else { fmt.Println("(unknown)") } } }
  • 144. import "fmt" import "path" import "runtime" func StackTrace() { var stack_trace []uintptr var my_path string runtime.Callers(1, stack_trace) for i, u := range stack_trace { if f := runtime.FuncForPC(u); f != nil { file, line := f.FileLine(u) switch filepath, filename := path.Split(file); { case i == 0: my_path = filepath case my_path != filepath: fmt.Printf("%v:%v", filename, line) } } else { fmt.Println("(unknown)") } } }
  • 145. reflections on Go dynamism through run-time type manipulation
  • 146. package generalise import "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := reflect.ValueOf(i); v.Kind() { case reflect.Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = reflect.MakeSlice(v.Type(), l, l).Interface() case reflect.Map: n = reflect.MakeMap(v.Type()).Interface() } return }
  • 147. package generalise import "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := reflect.ValueOf(i); v.Kind() { case reflect.Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = reflect.MakeSlice(v.Type(), l, l).Interface() case reflect.Map: n = reflect.MakeMap(v.Type()).Interface() } return }
  • 148. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 149. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 150. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 151. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 152. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 153. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 154. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 155. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 156. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 157. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 158. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 159. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 160. package generalise import . "reflect" func Allocate(i interface{}, limit... int) (n interface{}) { switch v := ValueOf(i); v.Kind() { case Slice: l := v.Cap() if len(limit) > 0 { l = limit[0] } n = MakeSlice(v.Type(), l, l).Interface() case Map: n = MakeMap(v.Type()).Interface() } return }
  • 161. func TestAllocate(t *testing.T) { var s2 []int s1 := []int{0, 1, 2} m := map[int] int{1: 1, 2: 2, 3: 3} switch { case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }): t.Fatal("Unable to allocate new slice") case len(s2) != 1 || cap(s2) != 1: t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2) case throwsPanic(func() { Allocate(m) }): t.Fatal("Unable to allocate new map") } }
  • 162. func TestAllocate(t *testing.T) { var s2 []int s1 := []int{0, 1, 2} m := map[int] int{1: 1, 2: 2, 3: 3} switch { case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }): t.Fatal("Unable to allocate new slice") case len(s2) != 1 || cap(s2) != 1: t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2) case throwsPanic(func() { Allocate(m) }): t.Fatal("Unable to allocate new map") } }
  • 163. func TestAllocate(t *testing.T) { var s2 []int s1 := []int{0, 1, 2} m := map[int] int{1: 1, 2: 2, 3: 3} switch { case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }): t.Fatal("Unable to allocate new slice") case len(s2) != 1 || cap(s2) != 1: t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2) case throwsPanic(func() { Allocate(m) }): t.Fatal("Unable to allocate new map") } }
  • 164. func TestAllocate(t *testing.T) { var s2 []int s1 := []int{0, 1, 2} m := map[int] int{1: 1, 2: 2, 3: 3} switch { case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }): t.Fatal("Unable to allocate new slice") case len(s2) != 1 || cap(s2) != 1: t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2) case throwsPanic(func() { Allocate(m) }): t.Fatal("Unable to allocate new map") } }
  • 165. func TestAllocate(t *testing.T) { var s2 []int s1 := []int{0, 1, 2} m := map[int] int{1: 1, 2: 2, 3: 3} switch { case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }): t.Fatal("Unable to allocate new slice") case len(s2) != 1 || cap(s2) != 1: t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2) case throwsPanic(func() { Allocate(m) }): t.Fatal("Unable to allocate new map") } }
  • 166. func TestAllocate(t *testing.T) { var s2 []int s1 := []int{0, 1, 2} m := map[int] int{1: 1, 2: 2, 3: 3} switch { case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }): t.Fatal("Unable to allocate new slice") case len(s2) != 1 || cap(s2) != 1: t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2) case throwsPanic(func() { Allocate(m) }): t.Fatal("Unable to allocate new map") } }
  • 167. func TestAllocate(t *testing.T) { var s2 []int s1 := []int{0, 1, 2} m := map[int] int{1: 1, 2: 2, 3: 3} switch { case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }): t.Fatal("Unable to allocate new slice") case len(s2) != 1 || cap(s2) != 1: t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2) case throwsPanic(func() { Allocate(m) }): t.Fatal("Unable to allocate new map") } }
  • 168. func TestAllocate(t *testing.T) { var s2 []int s1 := []int{0, 1, 2} m := map[int] int{1: 1, 2: 2, 3: 3} switch { case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }): t.Fatal("Unable to allocate new slice") case len(s2) != 1 || cap(s2) != 1: t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2) case throwsPanic(func() { Allocate(m) }): t.Fatal("Unable to allocate new map") } }
  • 169. func TestAllocate(t *testing.T) { var s2 []int s1 := []int{0, 1, 2} m := map[int] int{1: 1, 2: 2, 3: 3} switch { case throwsPanic(func() { s2 = Allocate(s1, 1).([]int) }): t.Fatal("Unable to allocate new slice") case len(s2) != 1 || cap(s2) != 1: t.Fatalf("New slice should be %v not %v", make([]int, 0, 1), s2) case throwsPanic(func() { Allocate(m) }): t.Fatal("Unable to allocate new map") } }
  • 170. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 171. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 172. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 173. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 174. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 175. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 176. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 177. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 178. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 179. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 180. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 181. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 182. func Duplicate(i interface{}) (clone interface{}) { if clone = Allocate(i); clone != nil { switch clone := ValueOf(clone); clone.Kind() { case Slice: Copy(clone, ValueOf(i)) case Map: m := ValueOf(i) for _, k := range m.Keys() { clone.SetMapIndex(k, m.MapIndex(k)) } } } return }
  • 183. metallic k.o. sometimes a bit-buffer is just a bit-buffer
  • 184. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 185. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 186. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 187. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 188. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 189. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 190. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 191. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 192. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 193. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 194. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 195. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 196. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 197. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 198. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 199. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 200. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 201. package raw import . "reflect" import "unsafe" var _BYTE_SLICE Type = Typeof([]byte(nil)) type MemoryBlock interface { ByteSlice() []byte } func valueHeader(v Value) (header *SliceHeader) { if v.IsValid() { s := int(v.Type().Size()) header = &SliceHeader{ v.UnsafeAddr(), s, s } } return }
  • 202. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 203. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 204. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 205. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 206. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 207. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 208. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 209. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 210. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 211. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 212. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 213. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 214. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 215. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 216. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 217. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 218. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 219. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 220. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 221. func SliceHeader(i interface{}) (Header *SliceHeader, Size, Align int) { switch value := Indirect(ValueOf(i)); value.Kind() { case Slice: Header = (*SliceHeader)(unsafe.Pointer(value.UnsafeAddr())) t := value.Type().Elem() Size = int(t.Size()) Align = t.Align() case Interface: Header, Size, Align = SliceHeader(value.Elem()) } return } func Scale(oldHeader *SliceHeader, oldESize, newESize int) (h *SliceHeader) { if oldHeader != nil { s := float64(oldESize) / float64(newESize) h = &SliceHeader{ Data: oldHeader.Data } h.Len = int(float64(oldHeader.Len) * s) h.Cap = int(float64(oldHeader.Cap) * s) } return }
  • 222. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 223. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 224. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 225. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 226. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 227. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 228. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 229. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 230. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 231. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 232. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 233. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 234. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 235. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 236. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 237. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 238. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 239. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 240. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 241. func ByteSlice(i interface{}) []byte { switch i := i.(type) { case []byte: return i case MemoryBlock: return i.ByteSlice() } var header *SliceHeader switch v := ValueOf(i); value.Kind() { case Interface, Ptr: header = valueHeader(v.Elem()) case Slice: h, s, _ := SliceHeader(i) header = Scale(h, s, 1) case String: s := v.Get() h := *(*StringHeader)(unsafe.Pointer(&s)) header = &SliceHeader{ h.Data, h.Len, h.Len } default: header = valueHeader(v) } return unsafe.Unreflect(_BYTE_SLICE, unsafe.Pointer(header)).([]byte) }
  • 242. go f(){}() / yourself / map/reduce for all the family
  • 243. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func() { for i := limit; i > 0; i-- { fmt.Print(<-c) produces: } 0110011101011010 }() for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 244. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func() { for i := limit; i > 0; i-- { fmt.Print(<-c) produces: } 0110011101011010 }() for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 245. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func() { for i := limit; i > 0; i-- { fmt.Print(<-c) produces: } 0110011101011010 }() for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 246. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func() { for i := limit; i > 0; i-- { fmt.Print(<-c) produces: } 0110011101011010 }() for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 247. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func() { for i := limit; i > 0; i-- { fmt.Print(<-c) produces: } 0110011101011010 }() for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 248. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func() { for i := limit; i > 0; i-- { fmt.Print(<-c) produces: } 0110011101011010 }() for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 249. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func() { for i := limit; i > 0; i-- { fmt.Print(<-c) produces: } 0110011101011010 }() for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 250. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func(in chan int) { for i := limit; i > 0; i-- { fmt.Print(<-in) produces: } 0110011101011010 }(c) for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 251. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func(in chan int) { for i := limit; i > 0; i-- { fmt.Print(<-in) produces: } 0110011101011010 }(c) for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 252. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func(in chan int) { for i := limit; i > 0; i-- { fmt.Print(<-in) produces: } 0110011101011010 }(c) for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 253. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func(in chan int) { for i := limit; i > 0; i-- { fmt.Print(<-in) produces: } 0110011101011010 }(c) for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 254. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func(in chan int) { for i := limit; i > 0; i-- { fmt.Print(<-in) produces: } 0110011101011010 }(c) for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 255. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func(in chan int) { for i := limit; i > 0; i-- { fmt.Print(<-in) produces: } 0110011101011010 }(c) for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 256. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func(in chan int) { for i := limit; i > 0; i-- { fmt.Print(<-in) produces: } 0110011101011010 }(c) for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 257. package main import "fmt" func main() { var c chan int c = make(chan int) limit := 16 go func(in chan int) { for i := limit; i > 0; i-- { fmt.Print(<-in) produces: } 0110011101011010 }(c) for i := limit; i > 0; i-- { select { case c <- 0: case c <- 1: } } }
  • 258. func main() { var c chan int c = make(chan int, 16) go func() { for i := 16; i > 0; i-- { fmt.Print(<-c) } }() go func() { select { produces: case c <- 0: 0110011101011010 case c <- 1: } }() for {} }
  • 259. func main() { var c chan int c = make(chan int, 16) go func() { for i := 16; i > 0; i-- { fmt.Print(<-c) } }() go func() { select { produces: case c <- 0: 0110011101011010 case c <- 1: } }() for {} }
  • 260. func main() { var c chan int c = make(chan int, 16) go func() { for i := 16; i > 0; i-- { fmt.Print(<-c) } }() go func() { select { produces: case c <- 0: 0110011101011010 case c <- 1: } }() for {} }
  • 261. func main() { var c chan int c = make(chan int, 16) go func() { for i := 16; i > 0; i-- { fmt.Print(<-c) } }() go func() { select { produces: case c <- 0: 0110011101011010 case c <- 1: } }() for {} }
  • 262. package generalise type SignalSource func(status chan bool) func Wait(s SignalSource) { done := make(chan bool) defer close(done) go s(done) <-done } func WaitAll(count int, s SignalSource) { done := make(chan bool) defer close(done) go s(done) for i := 0; i < count; i++ { <- done } }
  • 263. package generalise type SignalSource func(status chan bool) func Wait(s SignalSource) { done := make(chan bool) defer close(done) go s(done) <-done } func WaitAll(count int, s SignalSource) { done := make(chan bool) defer close(done) go s(done) for i := 0; i < count; i++ { <- done } }
  • 264. package generalise type SignalSource func(status chan bool) func Wait(s SignalSource) { done := make(chan bool) defer close(done) go s(done) <-done } func WaitAll(count int, s SignalSource) { done := make(chan bool) defer close(done) go s(done) for i := 0; i < count; i++ { <- done } }
  • 265. package generalise type SignalSource func(status chan bool) func Wait(s SignalSource) { done := make(chan bool) defer close(done) go s(done) <-done } func WaitAll(count int, s SignalSource) { done := make(chan bool) defer close(done) go s(done) for i := 0; i < count; i++ { <- done } }
  • 266. package generalise type SignalSource func(status chan bool) func Wait(s SignalSource) { done := make(chan bool) defer close(done) go s(done) <-done } func WaitAll(count int, s SignalSource) { done := make(chan bool) defer close(done) go s(done) for i := 0; i < count; i++ { <- done } }
  • 267. package generalise type SignalSource func(status chan bool) func Wait(s SignalSource) { done := make(chan bool) defer close(done) go s(done) <-done } func WaitAll(count int, s SignalSource) { done := make(chan bool) defer close(done) go s(done) for i := 0; i < count; i++ { <- done } }
  • 268. package generalise type SignalSource func(status chan bool) func Wait(s SignalSource) { done := make(chan bool) defer close(done) go s(done) <-done } func WaitAll(count int, s SignalSource) { done := make(chan bool) defer close(done) go s(done) for i := 0; i < count; i++ { <- done } }
  • 269. package generalise type SignalSource func(status chan bool) func Wait(s SignalSource) { done := make(chan bool) defer close(done) go s(done) <-done } func WaitAll(count int, s SignalSource) { done := make(chan bool) defer close(done) go s(done) for i := 0; i < count; i++ { <- done } }
  • 270. type Iteration func(k, x interface{}) bool func (i Iteration) apply(k, v interface{}, c chan bool) { go func() { c <-i(k, v) }() } func (f Iteration) Each(c interface{}) { switch c := ValueOf(c); c.Kind() { case Slice: WaitAll(c.Len(), SignalSource(func(done chan bool) { for i := 0; i < c.Len(); i++ { f.apply(i, c.Elem(i).Interface(), done) }})) case Map: WaitAll(c.Len(), SignalSource(func(done chan bool) { for _, k := range c.Keys() { f.apply(k, c.Elem(k).Interface(), done) }})) } }
  • 271. type Iteration func(k, x interface{}) bool func (i Iteration) apply(k, v interface{}, c chan bool) { go func() { c <-i(k, v) }() } func (f Iteration) Each(c interface{}) { switch c := ValueOf(c); c.Kind() { case Slice: WaitAll(c.Len(), SignalSource(func(done chan bool) { for i := 0; i < c.Len(); i++ { f.apply(i, c.Elem(i).Interface(), done) }})) case Map: WaitAll(c.Len(), SignalSource(func(done chan bool) { for _, k := range c.Keys() { f.apply(k, c.Elem(k).Interface(), done) }})) } }
  • 272. type Iteration func(k, x interface{}) bool func (i Iteration) apply(k, v interface{}, c chan bool) { go func() { c <-i(k, v) }() } func (f Iteration) Each(c interface{}) { switch c := ValueOf(c); c.Kind() { case Slice: WaitAll(c.Len(), SignalSource(func(done chan bool) { for i := 0; i < c.Len(); i++ { f.apply(i, c.Elem(i).Interface(), done) }})) case Map: WaitAll(c.Len(), SignalSource(func(done chan bool) { for _, k := range c.Keys() { f.apply(k, c.Elem(k).Interface(), done) }})) } }
  • 273. type Iteration func(k, x interface{}) bool func (i Iteration) apply(k, v interface{}, c chan bool) { go func() { c <-i(k, v) }() } func (f Iteration) Each(c interface{}) { switch c := ValueOf(c); c.Kind() { case Slice: WaitAll(c.Len(), SignalSource(func(done chan bool) { for i := 0; i < c.Len(); i++ { f.apply(i, c.Elem(i).Interface(), done) }})) case Map: WaitAll(c.Len(), SignalSource(func(done chan bool) { for _, k := range c.Keys() { f.apply(k, c.Elem(k).Interface(), done) }})) } }
  • 274. type Iteration func(k, x interface{}) bool func (i Iteration) apply(k, v interface{}, c chan bool) { go func() { c <-i(k, v) }() } func (f Iteration) Each(c interface{}) { switch c := ValueOf(c); c.Kind() { case Slice: WaitAll(c.Len(), SignalSource(func(done chan bool) { for i := 0; i < c.Len(); i++ { f.apply(i, c.Elem(i).Interface(), done) }})) case Map: WaitAll(c.Len(), SignalSource(func(done chan bool) { for _, k := range c.Keys() { f.apply(k, c.Elem(k).Interface(), done) }})) } }
  • 275. type Iteration func(k, x interface{}) bool func (i Iteration) apply(k, v interface{}, c chan bool) { go func() { c <-i(k, v) }() } func (f Iteration) Each(c interface{}) { switch c := ValueOf(c); c.Kind() { case Slice: WaitAll(c.Len(), SignalSource(func(done chan bool) { for i := 0; i < c.Len(); i++ { f.apply(i, c.Elem(i).Interface(), done) }})) case Map: WaitAll(c.Len(), SignalSource(func(done chan bool) { for _, k := range c.Keys() { f.apply(k, c.Elem(k).Interface(), done) }})) } }
  • 276. type Iteration func(k, x interface{}) bool func (i Iteration) apply(k, v interface{}, c chan bool) { go func() { c <-i(k, v) }() } func (f Iteration) Each(c interface{}) { switch c := ValueOf(c); c.Kind() { case Slice: WaitAll(c.Len(), SignalSource(func(done chan bool) { for i := 0; i < c.Len(); i++ { f.apply(i, c.Elem(i).Interface(), done) }})) case Map: WaitAll(c.Len(), SignalSource(func(done chan bool) { for _, k := range c.Keys() { f.apply(k, c.Elem(k).Interface(), done) }})) } }
  • 277. type Iteration func(k, x interface{}) bool func (i Iteration) apply(k, v interface{}, c chan bool) { go func() { c <-i(k, v) }() } func (f Iteration) Each(c interface{}) { switch c := ValueOf(c); c.Kind() { case Slice: WaitAll(c.Len(), SignalSource(func(done chan bool) { for i := 0; i < c.Len(); i++ { f.apply(i, c.Elem(i).Interface(), done) }})) case Map: WaitAll(c.Len(), SignalSource(func(done chan bool) { for _, k := range c.Keys() { f.apply(k, c.Elem(k).Interface(), done) }})) } }
  • 278. type Iteration func(k, x interface{}) bool func (i Iteration) apply(k, v interface{}, c chan bool) { go func() { c <-i(k, v) }() } func (f Iteration) Each(c interface{}) { switch c := ValueOf(c); c.Kind() { case Slice: WaitAll(c.Len(), SignalSource(func(done chan bool) { for i := 0; i < c.Len(); i++ { f.apply(i, c.Elem(i).Interface(), done) }})) case Map: WaitAll(c.Len(), SignalSource(func(done chan bool) { for _, k := range c.Keys() { f.apply(k, c.Elem(k).Interface(), done) }})) } }
  • 279. type Results chan interface{} type Combination func(x, y interface{}) interface{} func (f Combination) Reduce(c, s interface{}) (r Results) { r = make(Results) go func() { Iteration(func(k, x interface{}) bool { s = f(s, x) return true }).Each(c) r <- s }() return }
  • 280. type Results chan interface{} type Combination func(x, y interface{}) interface{} func (f Combination) Reduce(c, s interface{}) (r Results) { r = make(Results) go func() { Iteration(func(k, x interface{}) bool { s = f(s, x) return true }).Each(c) r <- s }() return }
  • 281. type Results chan interface{} type Combination func(x, y interface{}) interface{} func (f Combination) Reduce(c, s interface{}) (r Results) { r = make(Results) go func() { Iteration(func(k, x interface{}) bool { s = f(s, x) return true }).Each(c) r <- s }() return }
  • 282. type Results chan interface{} type Combination func(x, y interface{}) interface{} func (f Combination) Reduce(c, s interface{}) (r Results) { r = make(Results) go func() { Iteration(func(k, x interface{}) bool { s = f(s, x) return true }).Each(c) r <- s }() return }
  • 283. type Results chan interface{} type Combination func(x, y interface{}) interface{} func (f Combination) Reduce(c, s interface{}) (r Results) { r = make(Results) go func() { Iteration(func(k, x interface{}) bool { s = f(s, x) return true }).Each(c) r <- s }() return }
  • 284. type Results chan interface{} type Combination func(x, y interface{}) interface{} func (f Combination) Reduce(c, s interface{}) (r Results) { r = make(Results) go func() { Iteration(func(k, x interface{}) bool { s = f(s, x) return true }).Each(c) r <- s }() return }
  • 285. type Results chan interface{} type Combination func(x, y interface{}) interface{} func (f Combination) Reduce(c, s interface{}) (r Results) { r = make(Results) go func() { Iteration(func(k, x interface{}) bool { s = f(s, x) return true }).Each(c) r <- s }() return }
  • 286. type Results chan interface{} type Combination func(x, y interface{}) interface{} func (f Combination) Reduce(c, s interface{}) (r Results) { r = make(Results) go func() { Iteration(func(k, x interface{}) bool { s = f(s, x) return true }).Each(c) r <- s }() return }
  • 287. type Results chan interface{} type Combination func(x, y interface{}) interface{} func (f Combination) Reduce(c, s interface{}) (r Results) { r = make(Results) go func() { Iteration(func(k, x interface{}) bool { s = f(s, x) return true }).Each(c) r <- s }() return }
  • 288. type Results chan interface{} type Combination func(x, y interface{}) interface{} func (f Combination) Reduce(c, s interface{}) (r Results) { r = make(Results) go func() { Iteration(func(k, x interface{}) bool { s = f(s, x) return true }).Each(c) r <- s }() return }
  • 289. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 290. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 291. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 292. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 293. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 294. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 295. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 296. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 297. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 298. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 299. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 300. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 301. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 302. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 303. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 304. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 305. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 306. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 307. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 308. type Transformation func(x interface{}) interface{} func (t Transformation) Transform(x interface{}) Value { return ValueOf(t(x)) } func (t Transformation) Map(c interface{}) (r interface{}) { r = Allocate(c) if i := MapIterator(r); i != nil { i.Each(c) } return }
  • 309. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 310. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 311. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 312. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 313. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 314. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 315. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 316. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 317. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 318. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 319. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 320. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 321. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 322. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 323. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 324. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 325. func MapIterator(c interface{}) (i Iteration) { switch n := ValueOf(c); n.Kind() { case Slice: i = Iteration(func(k, x interface{}) bool { n.Elem(k.(int)).SetValue(t.GetValue(x)) return true }) case Map: i = Iteration(func(k, x interface{}) bool { n.SetMapIndex(ValueOf(k), t.GetValue(x)) return true }) } return }
  • 326. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 327. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 328. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 329. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 330. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 331. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 332. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 333. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 334. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 335. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 336. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 337. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 338. func main() { s := []int{0, 1, 2, 3, 4, 5} d := Transformation(func(x interface{}) interface{} { return x.(int) * 2 }).Map(s) sum := Combination(func(x, y interface{}) interface{} { return x.(int) + y.(int) }) fmt.Printf("s = %v, sum = %vn", s, <- sum.Reduce(s, 0)) fmt.Printf("d = %v, sum = %vn", d, <- sum.Reduce(d, 0)) } produces: s = [0 1 2 3 4 5], sum = 15 d = [0 2 4 6 8 10], sum = 30
  • 339. ruby can do that! channels with atomic queues and thread variables
  • 340. require 'socket' require 'thread' class ThreadGroup def all_but_me &block list. delete_if { |t| t.name == Thread.current.name }.each { |t| yield t } end def select *names, &block list.delete_if { |t| !names.include? t.name }.each { |t| yield t } end end
  • 341. class Thread def initialize self[:Q] = Queue.new end def send *messages messages.each { |m| self[:Q].enq m } end def bind_transmitter socket key? :XMIT ? raise ArgumentError : self[:XMIT] = Thread.new() { loop do (m = self[:Q].deq) == :EXIT ? Thread.current.exit : socket.puts m Thread.pass end socket.close exit } end def disconnect send "Goodbye #{name}", :EXIT end end
  • 342. class ChatServer < TCPServer def initialize port @receivers = ThreadGroup.new @transmitters = ThreadGroup.new @deceased = ThreadGroup.new super end def register name, socket @receivers.add(t = Thread.current) t.name = name @transmitters.add t.bind_transmitter(socket) broadcast "#{name} has joined the conversation" t.send "Welcome #{name}" end def connect socket loop do begin socket.print "Please enter your name: " register socket.readline.chomp).downcase, socket break rescue ArgumentError socket.puts "That name is already in use" end end end
  • 343. def send message, name = Thread.current.name @receivers.select(name) { |t| t.send message } end def broadcast message @receivers.all_but_me { |t| t.send message } end def listen socket t = Thread.current loop do message = socket.readline.chomp case message.downcase when "bye": raise EOFError when "known": list_known_users when "quit": raise SystemExit else broadcast "#{t.name}: #{message}" end end end
  • 344. def run while socket = accept Thread.new(socket) do |socket| begin connect socket listen socket rescue SystemExit broadcast "#{Thread.current.name} terminated this conversation" broadcast :EXIT send :EXIT @receivers.all_but_me { |t| t.transmitter.join } Kernel.exit 0 rescue EOFError disconnect end end end end end ChatServer.new(3939).run
  • 345. great artists steal the Thompson-Pike approach to legacy C assimilation
  • 346. include $(GOROOT)/src/Make.inc TARG=sqlite3 CGOFILES= sqlite3.go database.go ifeq ($(GOOS),darwin) CGO_LDFLAGS=/usr/lib/libsqlite3.0.dylib else CGO_LDFLAGS=-lsqlite3 endif include $(GOROOT)/src/Make.pkg
  • 347. include $(GOROOT)/src/Make.inc TARG=sqlite3 CGOFILES= sqlite3.go database.go ifeq ($(GOOS),darwin) CGO_LDFLAGS=/usr/lib/libsqlite3.0.dylib else CGO_LDFLAGS=-lsqlite3 endif include $(GOROOT)/src/Make.pkg
  • 348. include $(GOROOT)/src/Make.inc TARG=sqlite3 CGOFILES= sqlite3.go database.go ifeq ($(GOOS),darwin) CGO_LDFLAGS=/usr/lib/libsqlite3.0.dylib else CGO_LDFLAGS=-lsqlite3 endif include $(GOROOT)/src/Make.pkg
  • 349. include $(GOROOT)/src/Make.inc TARG=sqlite3 CGOFILES= sqlite3.go database.go ifeq ($(GOOS),darwin) CGO_LDFLAGS=/usr/lib/libsqlite3.0.dylib else CGO_LDFLAGS=-lsqlite3 endif include $(GOROOT)/src/Make.pkg
  • 350. include $(GOROOT)/src/Make.inc TARG=sqlite3 CGOFILES= sqlite3.go database.go ifeq ($(GOOS),darwin) CGO_LDFLAGS=/usr/lib/libsqlite3.0.dylib else CGO_LDFLAGS=-lsqlite3 endif include $(GOROOT)/src/Make.pkg
  • 351. package sqlite3 // #include <sqlite3.h> import "C" import "fmt" import "os" type Database struct { handle *C.sqlite3 Filename string Flags C.int } func (db *Database) Error() os.Error { return Errno(C.sqlite3_errcode(db.handle)) }
  • 352. package sqlite3 // #include <sqlite3.h> import "C" import "fmt" import "os" type Database struct { handle *C.sqlite3 Filename string Flags C.int } func (db *Database) Error() os.Error { return Errno(C.sqlite3_errcode(db.handle)) }
  • 353. package sqlite3 // #include <sqlite3.h> import "C" import "fmt" import "os" type Database struct { handle *C.sqlite3 Filename string Flags C.int } func (db *Database) Error() os.Error { return Errno(C.sqlite3_errcode(db.handle)) }
  • 354. package sqlite3 // #include <sqlite3.h> import "C" import "fmt" import "os" type Database struct { handle *C.sqlite3 Filename string Flags C.int } func (db *Database) Error() os.Error { return Errno(C.sqlite3_errcode(db.handle)) }
  • 355. package sqlite3 // #include <sqlite3.h> import "C" import "fmt" import "os" type Database struct { handle *C.sqlite3 Filename string Flags C.int } func (db *Database) Error() os.Error { return Errno(C.sqlite3_errcode(db.handle)) }
  • 356. package sqlite3 // #include <sqlite3.h> import "C" import "fmt" import "os" type Database struct { handle *C.sqlite3 Filename string Flags C.int } func (db *Database) Error() os.Error { return Errno(C.sqlite3_errcode(db.handle)) }
  • 357. package sqlite3 // #include <sqlite3.h> import "C" import "fmt" import "os" type Database struct { handle *C.sqlite3 Filename string Flags C.int } func (db *Database) Error() os.Error { return Errno(C.sqlite3_errcode(db.handle)) }
  • 358. const( OK = Errno(iota) ERROR CANTOPEN = Errno(14) ) var errText = map[Errno]string { ERROR: "SQL error or missing database", CANTOPEN: "Unable to open the database file", } type Errno int func (e Errno) String() (err string) { if err = errText[e]; err == "" { err = fmt.Sprintf("errno %v", int(e)) } return }
  • 359. const( OK = Errno(iota) ERROR CANTOPEN = Errno(14) ) var errText = map[Errno]string { ERROR: "SQL error or missing database", CANTOPEN: "Unable to open the database file", } type Errno int func (e Errno) String() (err string) { if err = errText[e]; err == "" { err = fmt.Sprintf("errno %v", int(e)) } return }
  • 360. const( OK = Errno(iota) ERROR CANTOPEN = Errno(14) ) var errText = map[Errno]string { ERROR: "SQL error or missing database", CANTOPEN: "Unable to open the database file", } type Errno int func (e Errno) String() (err string) { if err = errText[e]; err == "" { err = fmt.Sprintf("errno %v", int(e)) } return }
  • 361. const( OK = Errno(iota) ERROR CANTOPEN = Errno(14) ) var errText = map[Errno]string { ERROR: "SQL error or missing database", CANTOPEN: "Unable to open the database file", } type Errno int func (e Errno) String() (err string) { if err = errText[e]; err == "" { err = fmt.Sprintf("errno %v", int(e)) } return }
  • 362. const( OK = Errno(iota) ERROR CANTOPEN = Errno(14) ) var errText = map[Errno]string { ERROR: "SQL error or missing database", CANTOPEN: "Unable to open the database file", } type Errno int func (e Errno) String() (err string) { if err = errText[e]; err == "" { err = fmt.Sprintf("errno %v", int(e)) } return }
  • 363. const( OK = Errno(iota) ERROR CANTOPEN = Errno(14) ) var errText = map[Errno]string { ERROR: "SQL error or missing database", CANTOPEN: "Unable to open the database file", } type Errno int func (e Errno) String() (err string) { if err = errText[e]; err == "" { err = fmt.Sprintf("errno %v", int(e)) } return }
  • 364. const( OK = Errno(iota) ERROR CANTOPEN = Errno(14) ) var errText = map[Errno]string { ERROR: "SQL error or missing database", CANTOPEN: "Unable to open the database file", } type Errno int func (e Errno) String() (err string) { if err = errText[e]; err == "" { err = fmt.Sprintf("errno %v", int(e)) } return }
  • 365. const( OK = Errno(iota) ERROR CANTOPEN = Errno(14) ) var errText = map[Errno]string { ERROR: "SQL error or missing database", CANTOPEN: "Unable to open the database file", } type Errno int func (e Errno) String() (err string) { if err = errText[e]; err == "" { err = fmt.Sprintf("errno %v", int(e)) } return }
  • 366. const( OK = Errno(iota) ERROR CANTOPEN = Errno(14) ) var errText = map[Errno]string { ERROR: "SQL error or missing database", CANTOPEN: "Unable to open the database file", } type Errno int func (e Errno) String() (err string) { if err = errText[e]; err == "" { err = fmt.Sprintf("errno %v", int(e)) } return }
  • 367. const( OK = Errno(iota) ERROR CANTOPEN = Errno(14) ) var errText = map[Errno]string { ERROR: "SQL error or missing database", CANTOPEN: "Unable to open the database file", } type Errno int func (e Errno) String() (err string) { if err = errText[e]; err == "" { err = fmt.Sprintf("errno %v", int(e)) } return }
  • 368. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 369. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 370. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 371. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 372. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 373. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 374. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 375. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 376. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 377. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 378. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 379. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 380. func (db *Database) Open(flags... int) (e os.Error) { db.Flags = 0 for _, v := range flags { db.Flags = db.Flags | C.int(v) } f := C.CString(db.Filename) if err := Errno(C.sqlite3_open_v2(f, &db.handle, db.Flags, nil)); err != OK { e = err } else if db.handle == nil { e = CANTOPEN } return } func (db *Database) Close() { C.sqlite3_close(db.handle) db.handle = nil }
  • 381. func Open(filename string, flags... int) (db *Database, e os.Error) { defer func() { if x := recover(); x != nil { db.Close() db = nil e = ERROR } }() db = &Database{ Filename: filename } if len(flags) == 0 { e = db.Open( C.SQLITE_OPEN_FULLMUTEX, C.SQLITE_OPEN_READWRITE, C.SQLITE_OPEN_CREATE ) } else { e = db.Open(flags...) } return }
  • 382. func Open(filename string, flags... int) (db *Database, e os.Error) { defer func() { if x := recover(); x != nil { db.Close() db = nil e = ERROR } }() db = &Database{ Filename: filename } if len(flags) == 0 { e = db.Open( C.SQLITE_OPEN_FULLMUTEX, C.SQLITE_OPEN_READWRITE, C.SQLITE_OPEN_CREATE ) } else { e = db.Open(flags...) } return }
  • 383. func Open(filename string, flags... int) (db *Database, e os.Error) { defer func() { if x := recover(); x != nil { db.Close() db = nil e = ERROR } }() db = &Database{ Filename: filename } if len(flags) == 0 { e = db.Open( C.SQLITE_OPEN_FULLMUTEX, C.SQLITE_OPEN_READWRITE, C.SQLITE_OPEN_CREATE ) } else { e = db.Open(flags...) } return }
  • 384. func Open(filename string, flags... int) (db *Database, e os.Error) { defer func() { if x := recover(); x != nil { db.Close() db = nil e = ERROR } }() db = &Database{ Filename: filename } if len(flags) == 0 { e = db.Open( C.SQLITE_OPEN_FULLMUTEX, C.SQLITE_OPEN_READWRITE, C.SQLITE_OPEN_CREATE ) } else { e = db.Open(flags...) } return }
  • 385. func Open(filename string, flags... int) (db *Database, e os.Error) { defer func() { if x := recover(); x != nil { db.Close() db = nil e = ERROR } }() db = &Database{ Filename: filename } if len(flags) == 0 { e = db.Open( C.SQLITE_OPEN_FULLMUTEX, C.SQLITE_OPEN_READWRITE, C.SQLITE_OPEN_CREATE ) } else { e = db.Open(flags...) } return }
  • 386. func Open(filename string, flags... int) (db *Database, e os.Error) { defer func() { if x := recover(); x != nil { db.Close() db = nil e = ERROR } }() db = &Database{ Filename: filename } if len(flags) == 0 { e = db.Open( C.SQLITE_OPEN_FULLMUTEX, C.SQLITE_OPEN_READWRITE, C.SQLITE_OPEN_CREATE ) } else { e = db.Open(flags...) } return }
  • 387. func Open(filename string, flags... int) (db *Database, e os.Error) { defer func() { if x := recover(); x != nil { db.Close() db = nil e = ERROR } }() db = &Database{ Filename: filename } if len(flags) == 0 { e = db.Open( C.SQLITE_OPEN_FULLMUTEX, C.SQLITE_OPEN_READWRITE, C.SQLITE_OPEN_CREATE ) } else { e = db.Open(flags...) } return }
  • 388. func Open(filename string, flags... int) (db *Database, e os.Error) { defer func() { if x := recover(); x != nil { db.Close() db = nil e = ERROR } }() db = &Database{ Filename: filename } if len(flags) == 0 { e = db.Open( C.SQLITE_OPEN_FULLMUTEX, C.SQLITE_OPEN_READWRITE, C.SQLITE_OPEN_CREATE ) } else { e = db.Open(flags...) } return }
  • 389. package main // #include "ruby.h" import "C" import "fmt" import "os" type VALUE struct { cptr *C.VALUE } func main() { var stack_frame VALUE defer func() { C.ruby_cleanup(0) }() C.ruby_sysinit(len(os.Args), &os.Args[0]) C.ruby_init_stack(stack_frame.cptr) C.ruby_init() C.ruby_init_loadpath() run_ruby() }
  • 390. package main // #include "ruby.h" import "C" import "fmt" import "os" type VALUE struct { cptr *C.VALUE } func main() { var stack_frame VALUE defer func() { C.ruby_cleanup(0) }() C.ruby_sysinit(len(os.Args), &os.Args[0]) C.ruby_init_stack(stack_frame.cptr) C.ruby_init() C.ruby_init_loadpath() run_ruby() }
  • 391. package main // #include "ruby.h" import "C" import "fmt" import "os" type VALUE struct { cptr *C.VALUE } func main() { var stack_frame VALUE defer func() { C.ruby_cleanup(0) }() C.ruby_sysinit(len(os.Args), &os.Args[0]) C.ruby_init_stack(stack_frame.cptr) C.ruby_init() C.ruby_init_loadpath() run_ruby() }
  • 392. package main // #include "ruby.h" import "C" import "fmt" import "os" type VALUE struct { cptr *C.VALUE } func main() { var stack_frame VALUE defer func() { C.ruby_cleanup(0) }() C.ruby_sysinit(len(os.Args), &os.Args[0]) C.ruby_init_stack(stack_frame.cptr) C.ruby_init() C.ruby_init_loadpath() run_ruby() }
  • 393. package main // #include "ruby.h" import "C" import "fmt" import "os" type VALUE struct { cptr *C.VALUE } func main() { var stack_frame VALUE defer func() { C.ruby_cleanup(0) }() C.ruby_sysinit(len(os.Args), &os.Args[0]) C.ruby_init_stack(stack_frame.cptr) C.ruby_init() C.ruby_init_loadpath() run_ruby() }
  • 394. package main // #include "ruby.h" import "C" import "fmt" import "os" type VALUE struct { cptr *C.VALUE } func main() { var stack_frame VALUE defer func() { C.ruby_cleanup(0) }() C.ruby_sysinit(len(os.Args), &os.Args[0]) C.ruby_init_stack(stack_frame.cptr) C.ruby_init() C.ruby_init_loadpath() run_ruby() }
  • 395. package main // #include "ruby.h" import "C" import "fmt" import "os" type VALUE struct { cptr *C.VALUE } func main() { var stack_frame VALUE defer func() { C.ruby_cleanup(0) }() C.ruby_sysinit(len(os.Args), &os.Args[0]) C.ruby_init_stack(stack_frame.cptr) C.ruby_init() C.ruby_init_loadpath() run_ruby() }
  • 396. package main // #include "ruby.h" import "C" import "fmt" import "os" type VALUE struct { cptr *C.VALUE } func main() { var stack_frame VALUE defer func() { C.ruby_cleanup(0) }() C.ruby_sysinit(len(os.Args), &os.Args[0]) C.ruby_init_stack(stack_frame.cptr) C.ruby_init() C.ruby_init_loadpath() run_ruby() }
  • 397. func run_ruby() { C.rb_require("sum.rb") C.rb_eval_string("$summer = Summer.new") C.rb_eval_string("$result = $summer.sum(10)") result := C.rb_gv_get("result") fmt.Printf("Result = %vn", C.NUM2INT(result)) }
  • 400. homework embedded your favourite ruby in go you’ll need a dynamic shared library
  • 401. homework embedded your favourite ruby in go you’ll need a dynamic shared library the Ruby header files
  • 402. homework embedded your favourite ruby in go you’ll need a dynamic shared library and the Ruby header files the non-gcc go toolchain
  • 403. homework embedded your favourite ruby in go you’ll need a dynamic shared library and the Ruby header files the non-gcc go toolchain and some code that looks a bit like this...

Editor's Notes