【问题标题】:foo.Name undefined (type interface {} has no field or method Name)foo.Name 未定义(类型接口 {} 没有字段或方法名称)
【发布时间】:2015-06-24 12:45:38
【问题描述】:

我使用本地 golang 包“容器/列表”来管理堆栈中的 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 变量时,对象类型是 &inotify.Event。 当我弹出一项并转储变量时,我的对象类型是 &inotify.Event

对于错误消息,我认为这是接口接受类型对象的问题,但我不知道如何定义类型。

【问题讨论】:

    标签: list go containers


    【解决方案1】:

    您需要将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

    【讨论】:

    • 它可以工作,并且有了文档,我可以解决我的未来问题。
    猜你喜欢
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2019-06-26
    • 2014-08-26
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多