Go中不区分大小写的HasSuffix

时间:2017-08-09 09:37:04

标签: go case-sensitive

我正在寻找目录列表中的特定文件类型,并使用HasSuffix进行比较,寻找一些特定的文件类型。我想让这个比较案例不敏感。

有没有办法在HasSuffix函数中添加EqualFold或其他不区分大小写的比较?

2 个答案:

答案 0 :(得分:7)

你可以使用

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 :(得分:2)

  

“我正在寻找目录列表中的特定文件类型。我想使这个比较不区分大小写。”

例如,

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)
}