为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 233 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号