这个功能的“惯用”版本是什么?

时间:2013-11-17 08:04:40

标签: go

试图了解Go的心态。我编写了以下函数,该函数查找文件名中包含日期的文件夹的* .txt文件,获取最新日期并返回该日期。

func getLatestDate(path string) (time.Time, error) {
    if fns, e := filepath.Glob(filepath.Join(path, "*.txt")); e == nil {
        re, _ := regexp.Compile(`_([0-9]{8}).txt$`)
        max := ""
        for _, fn := range fns {
            if ms := re.FindStringSubmatch(fn); ms != nil {
                if ms[1] > max {
                    max = ms[1]
                }
            }
        }
        date, _ := time.Parse("20060102", max)
        return date, nil
    } else {
        return time.Time{}, e
    }
}

这个函数的惯用版本有哪些,如果有的话?

2 个答案:

答案 0 :(得分:11)

这是我的看法

  1. 使用MustCompile编译静态正则表达式。如果它不编译并保存错误检查,这将会引起恐慌
  2. hoist编译正则函数的regexp - 你只需要编译一次。请注意,我使用小写的首字母调用它,因此它不会在包外显示。
  3. 在检查错误时使用提前返回 - 这可以保存缩进并且是惯用的
  4. 为那些早期返回使用命名的返回参数 - 保存定义类型的nil值和一般打字(不是每个人的口味)
  5. return time.Parse直接检查错误(之前你没有)
  6. 代码

    var dateRe = regexp.MustCompile(`_([0-9]{8}).txt$`)
    
    func getLatestDate(path string) (date time.Time, err error) {
        fns, err := filepath.Glob(filepath.Join(path, "*.txt"))
        if err != nil {
            return
        }
        max := ""
        for _, fn := range fns {
            if ms := dateRe.FindStringSubmatch(fn); ms != nil {
                if ms[1] > max {
                    max = ms[1]
                }
            }
        }
        return time.Parse("20060102", max)
    }
    

答案 1 :(得分:0)

这是我写的方式。不要忽略错误,使用guard子句进行错误处理,也不要在循环中重新编译regexp。

var datePat = regexp.MustCompile(`_([0-9]{8}).txt$`)

func getLatestDate(path string) (time.Time, error) {
    fns, err := filepath.Glob(filepath.Join(path, "*.txt"))
    if err != nil {
        return time.Time{}, err
    }
    max := time.Time{}
    for _, fn := range fns {
        if ms := re.FindStringSubmatch(fn); ms != nil {
            if t, err := time.Parse("20060102", ms[1]); err == nil && t.After(max) {
                max = t
            }
        }
    }
    return max, nil
}