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

如何以go方式对数组/切片进行排序,go,Go,我有下面的代码,并问我自己这是解决以下要求的“方式”吗 我需要打印一个按文件年限排序的目录树 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")

我有下面的代码,并问我自己这是解决以下要求的“方式”吗

我需要打印一个按文件年限排序的目录树

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")
    }
}
主程序包
进口(
“fmt”
“github.com/kr/fs”
“操作系统”
“时间”
“排序”
)
类型fileinfo struct{
路径字符串
年龄、时间、持续时间
}
func main(){
格式打印(“fs的测试范围”)
walker:=fs.Walk(“..”)
var文件[]文件信息
对于walker.Step(){
如果错误:=walker.err();错误!=nil{
fmt.Fprintln(os.Stderr,err)
持续
}
年龄:=time.Now().Sub(walker.Stat().ModTime())
files=append(文件,fileinfo{walker.Path(),age})
}
sort.Slice(文件,func(i,j int)bool{
返回文件[i]。年龄<文件[j]。年龄
})
对于i:=0;i
你对代码有什么看法

谢谢你的帮助

for i:=0; i < len(files) ; i++ {
    fmt.Print("File path: ",files[i].Path," age: ",files[i].age,"\n")
}
更多信息,请参阅


由于末尾有一个换行符,每个元素之间有一个空格,
fmt.Println
可能比
fmt.Print
效果更好。它会自动在每个元素和末尾的换行符之间放置空格

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

为什么要为此使用第三方库(
github.com/kr/fs
)?标准库有什么问题?使用它就是“走的路”,因为我只想使用一个小代码。现在看来,最好使用std lib来实现这个。在上。在一个结构片上进行测距通常比使用索引效率低,因为前者需要逐个复制该片的所有元素。。范围仍然可以使用,但如果仅用于结构切片的索引,则速度更快。@icza您在技术上是正确的,但在Go中这种想法是错误的。在Go中,按值传递或按指针传递(或者在本例中,可以修改的对象)的决定应该取决于您是否打算更改原始对象。考虑的是安全,而不是性能。而且
range
的性能相当好,它为迭代器重用了相同的内存(这可能会让人抓狂)。使用
范围
,然后仅在分析表明对性能有必要时,才切换到传统的
循环。
fmt.Println("File path:", file.Path, "age:", file.age)