Last active
March 21, 2018 16:00
-
-
Save savsgio/08e6d8032d7a09e15e438e74299c4bbe to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// We often need our programs to perform operations on | |
// collections of data, like selecting all items that | |
// satisfy a given predicate or mapping all items to a new | |
// collection with a custom function. | |
// In some languages it's idiomatic to use [generic](http://en.wikipedia.org/wiki/Generic_programming) | |
// data structures and algorithms. Go does not support | |
// generics; in Go it's common to provide collection | |
// functions if and when they are specifically needed for | |
// your program and data types. | |
// Here are some example collection functions for slices | |
// of `strings`. You can use these examples to build your | |
// own functions. Note that in some cases it may be | |
// clearest to just inline the collection-manipulating | |
// code directly, instead of creating and calling a | |
// helper function. | |
package main | |
import "strings" | |
import "fmt" | |
// Index returns the first index of the target string `t`, or | |
// -1 if no match is found. | |
func IndexOf(vs []string, t string) int { | |
for i, v := range vs { | |
if v == t { | |
return i | |
} | |
} | |
return -1 | |
} | |
// Include returns `true` if the target string t is in the | |
// slice. | |
func Include(vs []string, t string) bool { | |
return IndexOf(vs, t) >= 0 | |
} | |
// Any returns `true` if one of the strings in the slice | |
// satisfies the predicate `f`. | |
func Any(vs []string, f func(string) bool) bool { | |
for _, v := range vs { | |
if f(v) { | |
return true | |
} | |
} | |
return false | |
} | |
// All returns `true` if all of the strings in the slice | |
// satisfy the predicate `f`. | |
func All(vs []string, f func(string) bool) bool { | |
for _, v := range vs { | |
if !f(v) { | |
return false | |
} | |
} | |
return true | |
} | |
// Filter returns a new slice containing all strings in the | |
// slice that satisfy the predicate `f`. | |
func Filter(vs []string, f func(string) bool) []string { | |
vsf := make([]string, 0) | |
for _, v := range vs { | |
if f(v) { | |
vsf = append(vsf, v) | |
} | |
} | |
return vsf | |
} | |
// Map returns a new slice containing the results of applying | |
// the function `f` to each string in the original slice. | |
func Map(vs []string, f func(string) string) []string { | |
vsm := make([]string, len(vs)) | |
for i, v := range vs { | |
vsm[i] = f(v) | |
} | |
return vsm | |
} | |
func main() { | |
// Here we try out our various collection functions. | |
var strs = []string{"peach", "apple", "pear", "plum"} | |
fmt.Println(IndexOf(strs, "pear")) | |
fmt.Println(Include(strs, "grape")) | |
fmt.Println(Any(strs, func(v string) bool { | |
return strings.HasPrefix(v, "p") | |
})) | |
fmt.Println(All(strs, func(v string) bool { | |
return strings.HasPrefix(v, "p") | |
})) | |
fmt.Println(Filter(strs, func(v string) bool { | |
return strings.Contains(v, "e") | |
})) | |
// The above examples all used anonymous functions, | |
// but you can also use named functions of the correct | |
// type. | |
fmt.Println(Map(strs, strings.ToUpper)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment