Go 中如何正确获取文件名字符串:FileInfo.Name() 方法调用详解

ioutil.ReadDir 返回的 FileInfo 切片中,element.Name 是一个方法而非字段,直接打印会输出函数地址;必须加括号调用 element.Name() 才能获取实际文件名字符串。

Go 中如何正确获取文件名字符串:FileInfo.Name() 方法调用详解 — `ioutil.ReadDir` 返回的 `FileInfo` 切片中,`element.Name` 是一个方法而非字段,直接打印会输出函数地址;必须加括号调用 `element.Name()` 才能获取实际文件名字符串。

在 Go 语言中,os.FileInfo 是一个接口类型,其定义如下(精简后):

type FileInfo interface {
    Name() string
    // ... 其他方法(Size, Mode, ModTime, IsDir 等)
}

注意:Name 是一个方法(method),不是结构体字段(field)。因此 element.Name 表示的是该方法的值(即函数指针),而 element.Name() 才是执行该方法并返回 string 类型的文件名。

你原始代码中的问题在于:

fmt.Println(element.Name) // ❌ 错误:打印方法地址(如 0x498abc),所有元素地址相同是因为它们指向同一个方法实现

✅ 正确写法应为:

fmt.Println(element.Name()) // ✅ 正确:调用方法,返回字符串,如 "kepler-10.xml"

完整修正后的程序如下:

package main

import (
    "fmt"
    "io/ioutil" // ⚠️ 注意:ioutil 在 Go 1.16+ 已弃用,推荐使用 os.ReadDir 或 filepath.Glob
)

func main() {
    systems, err := ioutil.ReadDir("./XML")
    if err != nil {
        fmt.Printf("读取目录失败: %v\n", err)
        return
    }
    fmt.Printf("# of planetary systems\t%d\n", len(systems))

    for _, element := range systems {
        fmt.Println(element.Name()) // ✅ 调用方法获取文件名
    }
}

? 重要提醒(兼容性与最佳实践)

// Go 1.16+ 推荐写法(无需 ioutil)
entries, err := os.ReadDir("./XML")
if err != nil {
    panic(err)
}
for _, entry := range entries {
    fmt.Println(entry.Name()) // DirEntry.Name() 同样是方法,需加 ()
}

? 小结

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。