2016-05-17 70 views
0

我想知道這是如何創建並傳遞'通用'(是啊,我知道,GoLang中的敏感詞)列表到FindAll函數的方式。Golang容器/列表創建一個FindAll函數

這裏是我的嘗試:

package main 

import (
    "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

原樣的代碼是非常好的,但你應該問你自己兩個問題:

1.爲什麼你不應該使用一個類型片? (接口{}的性能比顯式類型慢,但在Go 1.7中會大大提高)

2.將特定類型實現爲鏈接列表會更好嗎?

this東西可以更高效:

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一個更好的選擇,但是這一切都取決於你的使用情況。

+0

是的我知道性能數據結構是帶有切片的數組,但我目前正在研究該語言的功能以及如何使用這些功能進行導航。我會保持「代碼現在很好」。 – G4143