如何以一种方式对数组/切片进行排序

时间:2017-11-12 10:07:37

标签: go

我有以下代码并且问我自己这是" go way"解决以下要求。

我需要打印按文件年龄排序的目录树。

package main

import (
    "fmt"
    "github.com/kr/fs"
    "os"
    "time"
    "sort"
)

type fileinfo struct {
    Path string
    age time.Duration
}

func main() {
    fmt.Print("test range of fs")

    walker := fs.Walk("../")

    var files []fileinfo

    for walker.Step() {
        if err := walker.Err(); err != nil {
            fmt.Fprintln(os.Stderr, err)
            continue
        }

        age := time.Now().Sub(walker.Stat().ModTime())
        files = append(files,fileinfo{walker.Path(),age})
    }

    sort.Slice(files, func(i, j int) bool {
        return files[i].age < files[j].age
    })
    for i:=0; i < len(files) ; i++ {
        fmt.Print("File path: ",files[i].Path," age: ",files[i].age,"\n")
    }
}

您对代码的看法是什么?

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

for i:=0; i < len(files) ; i++ {
    fmt.Print("File path: ",files[i].Path," age: ",files[i].age,"\n")
}
使用for迭代器可以更好地编写

range数组循环。这使代码更容易阅读,避免愚蠢的错误,并且它可以与地图和频道等其他结构一起使用。

for _,file := range files {
    fmt.Print("File path: ",file.Path," age: ",file.age,"\n")
}

有关详情,请参阅Go by Example: Range

由于最后有一个换行符,并且每个元素之间有一个空格,fmt.Println可能比fmt.Print更好。它会自动在每个元素和最后一行之间添加空格。

fmt.Println("File path:", file.Path, "age:", file.age)