亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 容器/列表創建 FindAll 函數

Golang 容器/列表創建 FindAll 函數

Go
千萬里不及你 2022-01-10 16:57:36
我想知道這是否是創建“通用”(是的,我知道,GoLang 中的一個敏感詞)列表并將其傳遞給 FindAll 函數的方法。這是我的嘗試:package mainimport (    "container/list"    "fmt"    "strings")func FindAll(lst *list.List, p func(interface{}) bool) *list.List {    ans := list.New()    for i := lst.Front(); i != nil; i = i.Next() {        if p(i.Value) {            ans.PushBack(i.Value)        }    }    return ans}func ConvertToInt(p func(int) bool) func(interface{}) bool {    return func(v interface{}) bool {        if value, ok := v.(int); ok {            if p(value) {                return true            } else {                return false            }        } else {            return false        }    }}func IsEven(n int) bool {    if n%2 == 0 {        return true    }    return false}func ConvertoString(p func(s string) bool) func(interface{}) bool {    return func(v interface{}) bool {        if value, ok := v.(string); ok {            if p(value) {                return true            } else {                return false            }        } else {            return false        }    }}func IsHello(str string) bool {    if strings.ToLower(str) == "hello" {        return true    } else {        return false    }}func main() {    fmt.Println("Find All Programs!\n\n")    lsti := list.New()    for i := 0; i < 11; i++ {        lsti.PushBack(i)    }    ansIsEven := FindAll(lsti, ConvertToInt(IsEven))    for i := ansIsEven.Front(); i != nil; i = i.Next() {        if value, ok := i.Value.(int); ok {            fmt.Printf("Found even: %d\n", value)        } else {            fmt.Println("Huh! What's that?")        }    }}我已經玩了一段時間了,并認為在我說服自己它是正確的之前,我最好得到圍棋專家的建議。
查看完整描述

1 回答

?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

代碼原樣很好,但你應該問自己兩個問題:


1. 為什么不應該使用類型化切片?(與顯式類型相比,interface{} 性能較慢,盡管在 Go 1.7 中會大大提高)


2.將您的特定類型實現為鏈表會更好嗎?


像這樣的東西可以更有效:


type IntList []int


func (l IntList) Filter(fn func(v int) bool) IntList {

    var o IntList

    for _, v := range l {

        if fn(v) {

            o = append(o, v)

        }

    }

    return o

}

幾乎總是有更好的替代方案container/list,但這完全取決于您的用例。


查看完整回答
反對 回復 2022-01-10
  • 1 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號