# underscore.go **Repository Path**: zhangjunfang/underscore.go ## Basic Information - **Project Name**: underscore.go - **Description**: Helpfully Functional Go - A useful collection of Go utilities. Designed for programmer happiness. - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2015-04-28 - **Last Updated**: 2024-06-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## 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 :warning: Alert :warning: ------------------------------------------ This package is in heavy flux at the moment as I work to incorporate feedback from various sources. ### Map ### --------------------------------------------------------------------------- Map func([]A, func(A) B) []B Map accepts a slice or map and a function to produce a new collection. 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(slice), 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 operant 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 *MakeMap* 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.