go-underscore alternatives and similar packages
Based on the "Utilities" category.
Alternatively, view go-underscore alternatives based on common mentions on social networks and blogs.
-
项目文档
🚀Vite+Vue3+Gin的开发基础平台,支持TS和JS混用。它集成了JWT鉴权、权限管理、动态路由、显隐可控组件、分页封装、多点登录拦截、资源权限、上传下载、代码生成器【可AI辅助】、表单生成器和可配置的导入导出等开发必备功能。 -
excelize
Go language library for reading and writing Microsoft Excel™ (XLAM / XLSM / XLSX / XLTM / XLTX) spreadsheets -
Kopia
Cross-platform backup tool for Windows, macOS & Linux with fast, incremental backups, client-side end-to-end encryption, compression and data deduplication. CLI and GUI included. -
goreporter
A Golang tool that does static analysis, unit testing, code review and generate code quality report. -
create-go-app
✨ A complete and self-contained solution for developers of any qualification to create a production-ready project with backend (Go), frontend (JavaScript, TypeScript) and deploy automation (Ansible, Docker) by running only one CLI command. -
EaseProbe
A simple, standalone, and lightweight tool that can do health/status checking, written in Go. -
filetype
Fast, dependency-free Go package to infer binary file types based on the magic numbers header signature -
boilr
:zap: boilerplate template manager that generates files or directories from template repositories -
beaver
💨 A real time messaging system to build a scalable in-app notifications, multiplayer games, chat apps in web and mobile apps.
InfluxDB - Purpose built for real-time analytics at any scale.
Do you think we are missing an alternative of go-underscore or a related project?
README
Underscore.go
Move Fast; Optimize Late
A useful collection of Go utilities. Designed for programmer happiness.
TL;DR Sort-of like underscore.js, but for Go
API Documention
:warning: Warning
This package is in heavy flux at the moment as I work to incorporate feedback from various sources.
:squirrel: Todo
- [ ] godoc
- [ ] contains
- [ ] indexOf
- [ ] worker pools
- [x] parallel each
- [x] parallel map with worker pool
- [x] refactor to make functions first parameter (eg Each func(func(A), []A))
- [x] handle maps & slices
- [x] all
- [x] any
- [x] none
Typed Functions
Any
Each
Each func(func(A int), []A) Each func(func(A B), []A)
Applies the given iterator function to each element of a collection (slice or map).
If the collection is a Slice, the iterator function arguments are value, index
If the collection is a Map, the iterator function arguments are value, key
EachP is a Parallel implementation of Each and concurrently applies the given iterator function to each element of a collection (slice or map).
// var Each func(func(value interface{}, i interface{}), interface{})
var buffer bytes.Buffer
fn := func(s, i interface{}) {
buffer.WriteString(s.(string))
}
s := []string{"a", "b", "c", "d", "e"}
Each(fn, s)
expect := "abcde"
e := un.Each(fn, s)
fmt.Printf("%#v\n", e) //"abcde"
Typed Each can be defined using a function type and the MakeEach helper.
Using a Typed Slice
var EachInt func(func(value, i int), []int)
MakeEach(&EachInt)
var sum int
fn := func(v, i int) {
sum += v
}
i := []int{1, 2, 3, 4, 5}
EachInt(fn, i)
fmt.Printf("%#v\n", sum) //15
Using a Typed Map
var EachStringInt func(func(key string, value int), map[string]int)
var sum int
fn := func(v int, k string) {
sum += v
}
m := map[string]int{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
EachStringInt(fn, m)
fmt.Printf("%#v\n", sum) //15
Of note is the ability to close over variables within the calling scope.
Every
Map
Map func([]A, func(A) B) []B
Applies the given function to each element of a slice, returning a slice of results
The base Map function accepts interface{} types and returns []interface{}
// Map func(interface{}, func(interface{}) interface{}) []interface{}
s := []string{"a", "b", "c", "d"}
fn := func(s interface{}) interface{} {
return s.(string) + "!"
}
m := un.Map(ToI(s), fn)
fmt.Println(m) //["a!", "b!", "c!", "d!"]
Typed Maps can be defined using a function type and the MakeMap helper.
Map func([]A, func(A) B) []B
var SMap func([]string, func(string) string) []string
un.MakeMap(&SMap)
m := un.SMap(s, fn)
fmt.Println(m) //["a!", "b!", "c!", "d!"]
Of note is the return value of Map is a slice of the return type of the applied function.
Partition
Partition func([]A, func(A) bool) ([]A []A)
Partition splits a slice or map based on the evaluation of the supplied function
The base Partition function accepts interface{} types and returns []interface{}
// Partition func(interface{}, func(interface{}) bool) ([]interface{}, []interface{})
s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fn := func(i interface{}) bool {
return (i.(int) % 2) == 1
}
odd, even := un.Partition(s, fn)
fmt.Println(odd) //[1, 3, 5, 7, 9]
fmt.Println(even) //[2, 4, 6, 8, 10]
Typed Partitions can be defined using a function type and the MakePartition helper.
// Partition func([]A, func(A) bool) ([]A []A)
var IPartition func([]int, func(int) bool) ([]int, []int)
un.MakePartition(&IPartition)
s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fn := func(i int) bool {
return (i % 2) == 1
}
odd, even := un.IPartition(s, fn)
fmt.Println(odd) //[1, 3, 5, 7, 9]
fmt.Println(even) //[2, 4, 6, 8, 10]
Contains returns true if an object is in a slice.
o := "a"
s := []string{"a", "b", "c"}
b := un.Contains(s, o)
fmt.Println(b) //true
ToI converts a slice of arbitrary type []T into a slice of []interfaces{}
s := []int{1, 1, 3, 5, 8, 13}
i := un.ToI(s)
Notes
I am aware that the whole idea is not particularly very TheGoWay™, but it is useful as a learning exercise, and it is useful for moving fast and optimising later.