2017-08-09 62 views
2

我正在從目錄列表中查找特定文件類型,並使用HasSuffix進行比較以查找幾個特定的​​文件類型。我想讓這個比較大小寫不敏感。不區分大小寫HasSuffix in Go

有沒有辦法將EqualFold或其他不區分大小寫的比較添加到HasSuffix函數中?

回答

6

你可以只使用

if strings.HasSuffix(strings.ToLower(s), "suffix") { 
    // do something 
} 

您也可以編寫自己的包裝函數:

func hasSuffix(s, suffix string, caseSensitive bool) bool { 
    if caseSensitive { 
     return strings.HasSuffix(s, suffix) 
    } 
    return strings.HasSuffix(strings.ToLower(s), suffix) 
} 

對於文件名或路徑,你可以使用(見PeterSO的答案):

if strings.ToLower(filepath.Ext(s)) == ".fileending" { 
    // do something 
} 
+1

我不能確定「後綴」的情況下,所以我也將ToLower,以及似乎是最有意義的。 if strings.HasSuffix(strings.ToLower(s),strings.ToLower(extension)){ //做某事 } –

2

「我正在從直接找尋特定文件類型ry上市。我想作這種比較不區分大小寫「

例如,

package main 

import (
    "fmt" 
    "io/ioutil" 
    "os" 
    "path/filepath" 
    "strings" 
) 

func hasExts(path string, exts []string) bool { 
    pathExt := strings.ToLower(filepath.Ext(path)) 
    for _, ext := range exts { 
     if pathExt == strings.ToLower(ext) { 
      return true 
     } 
    } 
    return false 
} 

func main() { 
    dir := `./` 
    files, err := ioutil.ReadDir(dir) 
    if err != nil { 
     fmt.Fprintln(os.Stderr, err) 
     return 
    } 
    sourceExts := []string{".go", ".Py", ".c", ".cpp"} 
    for _, fi := range files { 
     if hasExts(fi.Name(), sourceExts) { 
      fmt.Println(fi.Name()) 
     } 
    } 
} 

輸出:

t.c 
t.go 
t.py 
t1.go 
t1.py 
t2.go 

對於strings.HasSuffix開始的一種特殊形式,通過複製代碼來自strings package

func HasSuffix(s, suffix string) bool { 
    return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix 
} 

然後修改它以適合您的目的。例如,

func hasSuffix(s, suffix string) bool { 
    return len(s) >= len(suffix) && 
     strings.ToLower(s[len(s)-len(suffix):]) == strings.ToLower(suffix) 
}