2015-06-24 62 views
2

我使用本地golang包「container/list」來管理堆棧中的inotify事件。當我訪問堆棧的項目時,我遇到了類型錯誤(我認爲)。foo.Name undefined(type interface {}沒有字段或方法名稱)

import (
    "golang.org/x/exp/inotify" 
    "container/list" 
    "log" 
    "fmt" 
) 

func main() { 
    stack := list.New() 
    watcher, err := inotify.NewWatcher() 

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

    err = watcher.Watch(os.Args[1]) 
    if err != nil { 
     log.Fatal(err) 
    } 

    for { 
     select { 
      case ev := <-watcher.Event: 
       stack.PushFront(ev) 

       fmt.Printf("%#v\n", ev) 
     } 

     foo := stack.Front().Value 

     fmt.Printf("%#v\n", foo) 
     log.Println("Name: ", foo.Name) 
    } 
} 

當我轉儲EV變量,該對象類型是& inotify.Event。 當我彈出一個項目並轉儲變量時,我的對象類型是& inotify.Event

隨着錯誤消息,我認爲這是一個接口的類型對象接受的問題,但我沒有找到如何定義類型。

回答

6

您需要對foo進行類型斷言,堆棧不知道它是什麼,它只是包含interface{}對象。

你需要做的是一樣的東西:

elem := stack.Front().Value 
if foo, ok := elem.(*inotify.Event); ok { 
     fmt.Printf("%#v\n", foo) 
     log.Println("Name: ", foo.Name) 
} 

ok bit確保如果它不事件,你的程序將不會崩潰。當然,你需要處理它不是的情況。

在接口轉換的更多信息,並輸入斷言:https://golang.org/doc/effective_go.html#interface_conversions

+0

它的工作原理,並與文檔,我可以解決我的問題,期貨。 –

相關問題