清華尹成帶你實戰GO案例(37)Go 集合功能
Go 集合功能
我們經常需要程式去處理一些集合資料,比如選出所有符合條件的資料或者使用一個自定義函式將一個集
合元素拷貝到另外一個集合。
在一些語言裡面,通常是使用泛化資料結構或者演算法。但是Go不支援泛化型別,在Go裡面如果你的程式
或者資料型別需要操作集合,那麼通常是為集合提供一些操作函式。
這裡演示了一些操作strings切片的集合函式,你可以使用這些例子來構建你自己的函式。注意在有些情況
下,使用內聯集合操作程式碼會更清晰,而不是去建立新的幫助函式。
執行結果
2
false
true
false
[peach apple pear]
我們經常需要程式去處理一些集合資料,比如選出所有符合條件的資料或者使用一個自定義函式將一個集
合元素拷貝到另外一個集合。
在一些語言裡面,通常是使用泛化資料結構或者演算法。但是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
相關文章
- 清華尹成帶你實戰GO案例(22)Go常量Go
- 清華尹成帶你實戰GO案例(28)Go 方法Go
- 清華尹成帶你實戰GO案例(35)Go 互斥Go
- 清華尹成帶你實戰GO案例(38)Go 介面Go
- 清華尹成帶你實戰GO案例(46)Go 排序Go排序
- 清華尹成帶你實戰GO案例(47)Go 切片Go
- 清華尹成帶你實戰GO案例(2) Go 字典Go
- 清華尹成帶你實戰GO案例(7)Go DeferGo
- 清華尹成帶你實戰GO案例(7)Go ExitGo
- 清華尹成帶你實戰GO案例(12)Go PanicGo
- 清華尹成帶你實戰GO案例(56)Go通道的同步功能Go
- 清華尹成帶你實戰GO案例(19)Go變數Go變數
- 清華尹成帶你實戰GO案例(23)Go 超時Go
- 清華尹成帶你實戰GO案例(29)Go 工作池Go
- 清華尹成帶你實戰GO案例(49)Go 時間Go
- 清華尹成帶你實戰GO案例(52)Go數值Go
- 清華尹成帶你實戰GO案例(54)Go 陣列Go陣列
- 清華尹成帶你實戰GO案例(57)Go通道方向Go
- 清華尹成帶你實戰GO案例(63)Go 指標Go指標
- 清華尹成帶你實戰GO案例(8)Go for迴圈Go
- 清華尹成帶你實戰GO案例(17) Go URL解析Go
- 清華尹成帶你實戰GO案例(20)Go 遍歷通道Go
- 清華尹成帶你實戰GO案例(25)Go 打點器Go
- 清華尹成帶你實戰GO案例(30)Go 關閉通道Go
- 清華尹成帶你實戰GO案例(39)Go 結構體Go結構體
- 清華尹成帶你實戰GO案例(40)Go 程式觸發Go
- 清華尹成帶你實戰GO案例(41)Go 程式執行Go
- 清華尹成帶你實戰GO案例(50)Go 時間戳Go時間戳
- 清華尹成帶你實戰GO案例(53)Go 數字解析Go
- 清華尹成帶你實戰GO案例(55)Go 隨機數Go隨機
- 清華尹成帶你實戰GO案例(58)Go通道緩衝Go
- 清華尹成帶你實戰GO案例(5)Go 自定義排序Go排序
- 清華尹成帶你實戰GO案例(10)Go JSON支援GoJSON
- 清華尹成帶你實戰GO案例(11)Go Line FiltersGoFilter
- 清華尹成帶你實戰GO案例(13)Go range函式Go函式
- 清華尹成帶你實戰GO案例(16)Go Switch語句Go
- 清華尹成帶你實戰GO案例(21)Go 並行通道ChannelGo並行
- 清華尹成帶你實戰GO案例(24)Go 錯誤處理Go