Unit testing os.FileInfo模拟不匹配

Unit testing os.FileInfo模拟不匹配,unit-testing,go,interface,mocking,typing,Unit Testing,Go,Interface,Mocking,Typing,在我的一个golang项目中,我模拟了测试用例的os.FileInfo 我不确定我是否正确理解golang的接口处理。 据我所知,下面的代码应该可以工作,但我收到一个编译器错误,说接口不匹配 我对GoDoc示例进行了一些修改,以防您想自己测试它 package main import ( "fmt" "io/ioutil" "log" ) type file interface{ Name() string } func readFiles() []fil

在我的一个golang项目中,我模拟了测试用例的
os.FileInfo

我不确定我是否正确理解golang的接口处理。 据我所知,下面的代码应该可以工作,但我收到一个编译器错误,说接口不匹配

我对GoDoc示例进行了一些修改,以防您想自己测试它

package main

import (
    "fmt"
    "io/ioutil"
    "log"
)

type file interface{
    Name() string
} 

func readFiles() []file{
    files, err := ioutil.ReadDir(".")

    if err != nil {
        log.Fatal(err)
    }

    return files
}

func main() {
    files := readFiles()

    for _, file := range files {
        fmt.Println(file.Name())
    }
}
在golang文档之后,
ioutil.ReadDir(“.”
应该返回一片
os.FileInfo
,这应该是我自己编写的
文件
接口的一个专门部分

有人能帮我摆脱这地狱般的误解和纠缠吗


非常感谢大家

os.FileInfo
是一个接口,它可以转换为
文件
。但是您尝试将
[]os.FileInfo
转换为
[]文件
。Slice不是接口,不能断言。

os.FileInfo
是接口,可以转换为
文件。但是您尝试将
[]os.FileInfo
转换为
[]文件
。Slice不是接口,不能断言。

要详细说明其他答案和注释,os.FileInfo确实满足了您定义的
文件
接口,但os.FileInfo的一片不会隐式转换为
文件
接口的一片。一个简单的解决方法是让您的
readFiles
显式地进行转换,例如

func readFiles() []file{
    fileInfos, err := ioutil.ReadDir(".")

    if err != nil {
        log.Fatal(err)
    }

    files := make([]file, len(fileInfos))
    for i, fi := range fileInfos {
        files[i] = fi
    }

    return files
}

为了详细说明其他答案和注释,os.FileInfo确实实现了您定义的
文件
接口,但os.FileInfo的一部分不会隐式转换为
文件
接口的一部分。一个简单的解决方法是让您的
readFiles
显式地进行转换,例如

func readFiles() []file{
    fileInfos, err := ioutil.ReadDir(".")

    if err != nil {
        log.Fatal(err)
    }

    files := make([]file, len(fileInfos))
    for i, fi := range fileInfos {
        files[i] = fi
    }

    return files
}
这就是我们谈论的。问题是片,而不是接口。看看这就是讨论的内容。问题是片而不是接口。请检查