foo.Name undefined(类型interface {}没有字段或方法名称)

时间:2015-06-24 12:45:38

标签: list go containers

我使用本机golang包“container / list”来管理堆栈中的inotify事件。当我访问堆栈的项目时,我的类型失败(我认为)。

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 变量时,对象类型为&amp; inotify.Event 。 当我弹出一个项目并转储变量时,我的对象类型是&amp; inotify.Event

使用错误消息我认为接口类型对象接受是一个问题,但我找不到定义类型。

1 个答案:

答案 0 :(得分:6)

你需要将foo的类型断言转换为*inotify.Event,堆栈不知道它是什么,它只保存interface{}个对象。

您需要做的是:

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

ok位可以确定它是否一个事件,您的程序不会崩溃。当然,你需要处理它不是的情况。

有关界面转换和类型断言的更多信息:https://golang.org/doc/effective_go.html#interface_conversions