在我的一个golang项目中,我去模拟os.FileInfo
的测试用例。
我不确定我是否正确理解golang的接口处理。 据我所知,下面的代码应该可以工作,但是我得到一个Compilererror,说接口不匹配。
我修改了this go-doc示例,以防您想自己测试一下。
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
的片段,该片段应该是我自己编写的file
界面的特化。
有人可以帮助我摆脱这种误解和纠缠吗?
非常感谢你们!
答案 0 :(得分:0)
os.FileInfo
是界面,可以转换为file
。但您尝试将[]os.FileInfo
转换为[]file
。 Slice不是接口,也不能断言。
答案 1 :(得分:0)
要详细说明其他答案和评论,os.FileInfo确实满足您已定义的file
接口,但是一部分os.FileInfo不会隐式转换为您的file
的一部分接口。一个简单的解决方法是让您的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
}