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 21.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 5func 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
- Self-reference to self wrapped in a Functor
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