首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个函数的“惯用”版本是什么?

这个函数的“惯用”版本是什么?
EN

Stack Overflow用户
提问于 2013-11-17 16:04:40
回答 2查看 292关注 0票数 2

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

代码语言:javascript
复制
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
    }
}

如果有的话,这个函数的更常用的版本是什么?

EN

回答 2

Stack Overflow用户

发布于 2013-11-17 16:20:38

以下是我的观点

  1. 使用MustCompile编译静态正则表达式。如果它没有编译,这将会引起恐慌,并保存一个错误检查,
  2. Hoist将正则表达式编译出函数--你只需要编译一次。注意,我使用了一个小写的首字母来调用它,所以它在包之外是不可见的。
  3. 在检查错误时使用提前返回-这节省了缩进,并且是惯用的go
  4. 为这些早期返回使用命名返回参数-节省了为类型和一般类型定义nil值和键入(不是每个人都喜欢的直接though)
  5. return time.Parse,它检查错误(您以前没有)

代码

代码语言:javascript
复制
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)
}
票数 11
EN

Stack Overflow用户

发布于 2013-11-17 16:24:23

下面是我会怎么写的。不要忽略错误,使用保护子句进行错误处理,并且不要在循环中重新编译regexp。

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20028579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档