我想知道這是否是創建“通用”(是的,我知道,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,但這完全取決于您的用例。
- 1 回答
- 0 關注
- 203 瀏覽
添加回答
舉報
0/150
提交
取消