プログラムでデータのコレクションに対して何か操作をしたい ことはよくあります。 与えられた述語を満たす全てのアイテムを選択したり、 カスタム関数を使って全てのアイテムを新しいコレクションに マッピングしたりといった具合です。 |
|
いくつかの言語では ジェネリック (generic) なデータ構造とアルゴリズムを使うのが慣習です。 しかし、Go はジェネリクスをサポートしていません。 Go では、プログラムやデータ型が必要とする場合だけ コレクション関数を提供するのが一般的です。 |
|
以下は、 |
|
package main |
|
import ( "fmt" "strings" ) |
|
Index は、目的の文字列 |
func Index(vs []string, t string) int { for i, v := range vs { if v == t { return i } } return -1 } |
Include は、文字列 |
func Include(vs []string, t string) bool { return Index(vs, t) >= 0 } |
Any は、スライスの文字列が 1 つでも述語 |
func Any(vs []string, f func(string) bool) bool { for _, v := range vs { if f(v) { return true } } return false } |
All は、スライスの全ての文字列が述語 |
func All(vs []string, f func(string) bool) bool { for _, v := range vs { if !f(v) { return false } } return true } |
Filter は、述語 |
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 は、元のスライスの各文字列に関数 |
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() { |
|
色々なコレクション関数を試します。 |
var strs = []string{"peach", "apple", "pear", "plum"} |
fmt.Println(Index(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") })) |
|
上の例は全て無名関数を使っていますが、 正しい型の名前付き関数を使うこともできます。 |
fmt.Println(Map(strs, strings.ToUpper)) |
}
|
$ go run collection-functions.go 2 false true false [peach apple pear] [PEACH APPLE PEAR PLUM] |
Next example: String Functions.