更具体地说:我有 2 个读者。一个是我从 os.Open("someExistingFile") 得到的,另一个是从 strings.NewReader("hello world") 得到的。其中一个实现了 Name(),另一个没有。我想让另一个也实现 Name() (例如返回“”)或(首选)仅在实际参数的类型支持时调用 Name() 。我希望下面的代码片段清楚地表明了我想要解决的问题。我玩过不同的接收器,即使有反射,但我没有达到目的......package mainimport ( "io" "os" "strings")func main() { stringReader := strings.NewReader("hello world") fileReader, _ := os.Open("someExistingFile") // error handling omitted fileReader.Name() printFilenameIfReaderIsFile(stringReader) printFilenameIfReaderIsFile(fileReader)}func printFilenameIfReaderIsFile(reader io.Reader) { // here I want to ... // ... either check if this reader is of type os.File and in this case call its Name() method (preferred) // ... or use a custom type instead of io.Reader. // This type's Name() method should return the filename for fileReader and nil for stringReader.}
1 回答
ITMISS
TA贡献1871条经验 获得超8个赞
您正在寻找类型开关控制结构。
你的printFilenameIfReaderIsFile
功能应该看起来像(实际上没有检查):
func printFilenameIfReaderIsFile(reader io.Reader) {
switch f := reader.(type) {
case *os.File:
// f is now *os.File (not a os.File!)
fmt.Printf("%s\n", f.Name())
}
}
编辑:不要忘记,os.Open
返回 a*os.File
而不是os.File
see docs!
- 1 回答
- 0 关注
- 109 浏览
添加回答
举报
0/150
提交
取消