为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
摇曳的蔷薇 2021-06-29 17:46:55
试图理解 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 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

这是我的看法

  1. 使用MustCompile编译静态正则表达式。如果它不编译并保存错误检查,这将导致恐慌

  2. 从函数中提升编译正则表达式 - 您只需要编译一次。请注意,我使用小写首字母命名它,因此在包外看不到它。

  3. 检查错误时使用提前返回 - 这可以节省缩进并且是惯用的

  4. 为那些早期返回使用命名返回参数 - 保存为类型和一般类型定义 nil 值(虽然不是每个人的口味)

  5. return time.Parse 直接检查错误(你以前不是)

编码

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)

}


查看完整回答
反对 回复 2021-07-12
?
交互式爱情

TA贡献1712条经验 获得超3个赞

这就是我将如何编写它。不要忽略错误,使用保护子句进行错误处理,并且不要在循环内重新编译正则表达式。


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

}


查看完整回答
反对 回复 2021-07-12
  • 2 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信