Go Snippets

Posted on September 2, 2022
Tags: codeetc

1 Functional

1.1 Lambda

f := func() interface{}{return 2}
fmt.Println(f())
//output 2
fmt.Println((func() interface{}{return 2})())
//output 2

1.2 Lazy Streams

type mystream struct{
	data int
	gen func() mystream
}

func natsfrom(n int) mystream{
	return mystream{data: n, gen: func() mystream{return natsfrom(n+1)}}
}

fmt.Println(natsfrom(3).gen().gen())
//output 5
func headst(k mystream) int{
	return k.data
}

func tailst(k mystream) mystream{
	return k.gen()
}

func take(n int, k mystream) []int{
	if n == 0{
		return []int{}
	}else{
		return append(take(n-1,tailst(k)),headst(k))

	}
}

1.3 Tree

  • Golang does not allow recursive data structs, 2 ways to solve this:
    • Self-reference to self wrapped in a Functor
      • Tree self-refers to ListFunctor(Tree)
    • Use pointer to self
type tree struct{
    data int
    left []tree //tree wrapped in List functor
    right *tree //pointer to self
  }

   a := tree{data:2,left: []tree{tree{data:4}}}
   fmt.Println(a.left[0].data)
   b := tree{data:2,right: &tree{data:4}}
   fmt.Println(b.right.data)

2 Misconception

2.1 Lazy Stream

  • Can’t call interface{} as function
func natsfrom(n int) []interface{}{
	return []interface{}{n,func() interface{}{return natsfrom(n+1)}}
}
fmt.Println(natsfrom(3))
//output [3 0x47e3c0]
fmt.Println(natsfrom(3)[1])
//ERROR Can't call interface{} as function