更具體地說(shuō):我有 2 個(gè)讀者。一個(gè)是我從 os.Open("someExistingFile") 得到的,另一個(gè)是從 strings.NewReader("hello world") 得到的。其中一個(gè)實(shí)現(xiàn)了 Name(),另一個(gè)沒(méi)有。我想讓另一個(gè)也實(shí)現(xiàn) Name() (例如返回“”)或(首選)僅在實(shí)際參數(shù)的類型支持時(shí)調(diào)用 Name() 。我希望下面的代碼片段清楚地表明了我想要解決的問(wèn)題。我玩過(guò)不同的接收器,即使有反射,但我沒(méi)有達(dá)到目的......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貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
您正在尋找類型開(kāi)關(guān)控制結(jié)構(gòu)。
你的printFilenameIfReaderIsFile
功能應(yīng)該看起來(lái)像(實(shí)際上沒(méi)有檢查):
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 關(guān)注
- 154 瀏覽
添加回答
舉報(bào)
0/150
提交
取消