Go 中不区分大小写的 HasSuffix

Case insensitive HasSuffix in Go

我正在从目录列表中查找特定文件类型,并使用 HasSuffix 进行比较以查找一些特定文件类型。我想让这个比较不区分大小写。

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

你可以直接使用

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
}

"I am looking for specific file types from a directory listing. I would like to make this comparison case insensitive."

例如,

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