Unit testing os.FileInfo模拟不匹配
在我的一个golang项目中,我模拟了测试用例的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
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
}
这就是我们谈论的。问题是片,而不是接口。看看这就是讨论的内容。问题是片而不是接口。请检查