go-itergen 代码生成工具 go-itergen

blov • 2266 次点击    
这是一个分享于 的项目,其中的信息可能已经有所发展或是发生改变。
**go-itergen** 解决了 Go 一个常规而又非常重要的问题:没有映射,没有过滤器,什么都没有。如果你是函数式背景会感到非常苦恼,现在 got-itergen 提供 Go 的常规函数生成功能,为可迭代的类型生成常规函数,比如 map 和 filter。 go-itergen 支持的操作: * **Map** * **Filter** * **All** * **Some** * **Concat** * **Find** * **ForEach** * **Reverse** * **Splice** * **Reduce** 生成代码: <pre class="brush:shell;toolbar: true; auto-links: false;">//go:generate go-itergen -t &#34;float64&#34; --pkg=&#34;mypkg&#34; --map=&#34;string&#34; --map=&#34;int&#34; --filter --all --some --foreach --concat --find --reverse --splice --reduce=&#34;string&#34; --reduce=&#34;int&#34;</pre> 代码示例: <pre class="brush:cpp ;toolbar: true; auto-links: false;">package mypkg import (     &#34;errors&#34; ) type Float64Iter []float64 func NewFloat64Iter(items ...float64) Float64Iter {     return Float64Iter(items) } type Float64IterMapResult []interface{} func (i Float64Iter) Map(fn func(int, float64) interface{}) Float64IterMapResult {     var result []interface{}     for n, item := range i {         result = append(result, fn(n, item))     }     return result } var ErrFloat64ToFloat64 = errors.New(&#34;cannot convert Float64IterMapResult to []float64&#34;) func (r Float64IterMapResult) Iter() (Float64Iter, error) {     var result []float64     for _, i := range r {         if _, ok := i.(float64); !ok {             return nil, ErrFloat64ToFloat64         }         result = append(result, i.(float64))     }     return Float64Iter(result), nil } var ErrFloat64ToString = errors.New(&#34;cannot convert Float64IterMapResult to []string&#34;) func (r Float64IterMapResult) ToString() ([]string, error) {     var result []string     for _, i := range r {         if _, ok := i.(string); !ok {             return nil, ErrFloat64ToString         }         result = append(result, i.(string))     }     return result, nil } var ErrFloat64ToInt = errors.New(&#34;cannot convert Float64IterMapResult to []int&#34;) func (r Float64IterMapResult) ToInt() ([]int, error) {     var result []int     for _, i := range r {         if _, ok := i.(int); !ok {             return nil, ErrFloat64ToInt         }         result = append(result, i.(int))     }     return result, nil } func (i Float64Iter) Filter(fn func(float64) bool) Float64Iter {     var result []float64     for _, item := range i {         if fn(item) {             result = append(result, item)         }     }     return Float64Iter(result) } func (i Float64Iter) All(fn func(float64) bool) bool {     for _, item := range i {         if !fn(item) {             return false         }     }     return true } func (i Float64Iter) Some(fn func(float64) bool) bool {     for _, item := range i {         if fn(item) {             return true         }     }     return false } func (i Float64Iter) ForEach(fn func(int, float64) interface{}) {     for n, item := range i {         fn(n, item)     } } func (i Float64Iter) Concat(i2 Float64Iter) Float64Iter {     return append(i, i2...) } func (i Float64Iter) Find(fn func(float64) bool) (float64, int) {     var zero float64     for i, item := range i {         if fn(item) {             return item, i         }     }     return zero, -1 } func (i Float64Iter) Reverse() Float64Iter {     var result []float64     for j := len(i) - 1; j &gt;= 0; j-- {         result = append(result, i[j])     }     return result } // Splice removes numDelete items from the slice // since start. If numDelete is -1 it will delete all // items after start. If start is higher than the // slice length or lower than 0 the whole slice // will be returned. func (i Float64Iter) Splice(start, numDelete int) Float64Iter {     var result Float64Iter     length := len(i)     if start &gt;= length-1 || start &lt; 0 {         return i     }     result = append(result, i[:start]...)     if numDelete &gt; -1 &amp;&amp; numDelete+start &lt; length {         result = append(result, i[start+numDelete:]...)     }     return result } func (i Float64Iter) ReduceInt(fn func(current float64, acc int, index int) int, initial int) int {     var result = initial     for idx, item := range i {         initial = fn(item, result, idx)     }     return result } func (i Float64Iter) ReduceString(fn func(current float64, acc string, index int) string, initial string) string {     var result = initial     for idx, item := range i {         initial = fn(item, result, idx)     }     return result }</pre> <pre class="brush:cpp ;toolbar: true; auto-links: false;">func main() {   rounded, err := NewFloat64Iter(1.2, 2.4, 3.5, 5.6).Filter(func(n float64) bool {         return n &gt; 2.0     }).Map(func(int i, n float64) interface{} {     return int(n)   }).ToInt()   fmt.Println(rounded) // [3 5] }</pre>
授权协议:
MIT
开发语言:
Google Go 查看源码»
操作系统:
跨平台
2266 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传