Go Snippets
Posted on September 2, 2022
Tags: codeetc
1 Functional
1.1 Lambda
:= func() interface{}{return 2}
f .Println(f())
fmt//output 2
.Println((func() interface{}{return 2})())
fmt//output 2
1.2 Lazy Streams
type mystream struct{
int
data func() mystream
gen }
func natsfrom(n int) mystream{
return mystream{data: n, gen: func() mystream{return natsfrom(n+1)}}
}
.Println(natsfrom(3).gen().gen())
fmt//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
- Self-reference to self wrapped in a Functor
type tree struct{
int
data []tree //tree wrapped in List functor
left *tree //pointer to self
right }
:= tree{data:2,left: []tree{tree{data:4}}}
a .Println(a.left[0].data)
fmt:= tree{data:2,right: &tree{data:4}}
b .Println(b.right.data) fmt
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)}}
}
.Println(natsfrom(3))
fmt//output [3 0x47e3c0]
.Println(natsfrom(3)[1])
fmt//ERROR Can't call interface{} as function