go-itergen

代码生成工具
授权协议 MIT
开发语言 Google Go
所属分类 程序开发、 代码生成工具
软件类型 开源软件
地区 不详
投 递 者 吕俊美
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

go-itergen 解决了 Go 一个常规而又非常重要的问题:没有映射,没有过滤器,什么都没有。如果你是函数式背景会感到非常苦恼,现在 got-itergen 提供 Go 的常规函数生成功能,为可迭代的类型生成常规函数,比如 map 和 filter。

go-itergen 支持的操作:

  • Map

  • Filter

  • All

  • Some

  • Concat

  • Find

  • ForEach

  • Reverse

  • Splice

  • Reduce

生成代码:

//go:generate go-itergen -t "float64" --pkg="mypkg" --map="string" --map="int" --filter --all --some --foreach --concat --find --reverse --splice --reduce="string" --reduce="int"

代码示例:

package mypkg
import (
    "errors"
)
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("cannot convert Float64IterMapResult to []float64")
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("cannot convert Float64IterMapResult to []string")
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("cannot convert Float64IterMapResult to []int")
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 >= 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 >= length-1 || start < 0 {
        return i
    }
    result = append(result, i[:start]...)
    if numDelete > -1 && numDelete+start < 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
}
func main() {
  rounded, err := NewFloat64Iter(1.2, 2.4, 3.5, 5.6).Filter(func(n float64) bool {
        return n > 2.0
    }).Map(func(int i, n float64) interface{} {
    return int(n)
  }).ToInt()
  fmt.Println(rounded) // [3 5]
}
 相关资料
  • Yaf提供了代码生成工具yaf_code generator, 所以也可以通过使用代码生成工具yaf_cg来完成这个简单的入门Demo 例 3.10. 代码生成工具的使用 php-yaf-src/tools/cg/yaf_cg sample 将得到的sample目录, 拷贝到Webserver的documentRoot目录下然后访问: 例 3.11. 在浏览器输入 http://www.y

  • 我正在根据参考指南学习使用Map结构。日食验证是 面向Web开发人员的Eclipse Java EE IDE。版本:开普勒服务版本2 pom。xml如下所示,与参考指南相同 它表示在构建项目时将生成实现代码。但是,它似乎不会在目标/生成的源文件夹下生成

  • 大多数Blockly应用程序需要将块转换为代码以执行。本页描述如何将代码生成器添加到自定义块。 首先,转到generators/目录并选择与您要生成的语言(JavaScript,Python,PHP,Lua,Dart等)相对应的子目录。假设您的代码块不适合现有类别,请创建一个新的JavaScript文件。这个新的JavaScript文件需要包含在<script ...>编辑器的HTML文件中的标记

  • Jboot 内置了一个简易的代码生成器,可以用来生成model层和Service层的基础代码,在生成代码之前,请先配置jboot.properties关于数据库相关的配置信息,Jboot 代码生成器会通过该配置去链接数据库。 jboot.datasource.type=mysql jboot.datasource.url=jdbc:mysql://127.0.0.1:3306/jbootdemo

  • 遵照此规范,在实际操作中,有许多重复。接下来推荐一款专为本规范量身定做的代码生成器 Laravel 5.x Scaffold Generator。 本扩展支持 5.1 ~ 5.5 版本的 Laravel。 只需要一个命令: 即可生成: $ php artisan make:scaffold Projects --schema="name:string:index,description:text:

  • 注: 内容来自官网资料 Java Generated Code 这个页面准确描述 protocol buffer 编译器为任何给定协议定义生成的java代码。proto2和proto3生成的代码之间的任何不同都将被高亮 - 注意在这份文档中描述的是这些生成代码的不同,而不是基本的消息类/接口,后者在两个版本中是相同的。在阅读这份文档之前你应该先阅读 proto2语言指南 和/或 proto3语言指