清華尹成帶你實戰GO案例(37)Go 集合功能

尹成發表於2018-05-22
Go 集合功能
我們經常需要程式去處理一些集合資料,比如選出所有符合條件的資料或者使用一個自定義函式將一個集
合元素拷貝到另外一個集合。
在一些語言裡面,通常是使用泛化資料結構或者演算法。但是Go不支援泛化型別,在Go裡面如果你的程式
或者資料型別需要操作集合,那麼通常是為集合提供一些操作函式。
這裡演示了一些操作strings切片的集合函式,你可以使用這些例子來構建你自己的函式。注意在有些情況
下,使用內聯集合操作程式碼會更清晰,而不是去建立新的幫助函式。
package main
import "strings"
import "fmt"
// 返回t在vs中第一次出現的索引,如果沒有找到t,返回-1
func Index(vs []string, t string) int {
for i, v := range vs {
for i, v := range vs {
if v == t {
return i
}
}
return -1
}
// 如果t存在於vs中,那麼返回true,否則false
func Include(vs []string, t string) bool {
return Index(vs, t) >= 0
}
// 如果使用vs中的任何一個字串作為函式f的引數可以讓f返回true,
// 那麼返回true,否則false
func Any(vs []string, f func(string) bool) bool {
for _, v := range vs {
if f(v) {
return true
}
}
return false
}
// 如果分別使用vs中所有的字串作為f的引數都能讓f返回true,
// 那麼返回true,否則返回false
func All(vs []string, f func(string) bool) bool {
for _, v := range vs {
if !f(v) {
return false
}
}
return true
}
// 返回一個新的字串切片,切片的元素為vs中所有能夠讓函式f
// 返回true的元素
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
}
// 返回一個bool型別切片,切片的元素為vs中所有字串作為f函式
// 引數所返回的結果
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))
}


執行結果
2
false
true
false
[peach apple pear]

[PEACH APPLE PEAR PLUM]





網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN



網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN

相關文章