func (n *Notifier) Watch(o Observer) { var err error var abspath string for _, basePath := range o.Path() { abspath, err = filepath.Abs(basePath) if err != nil { ERROR.Println("create watcher error:", err) continue } if n.contain(abspath) { continue } var watcher *fsnotify.Watcher watcher, err = fsnotify.NewWatcher() //collect 100 events watcher.Event = make(chan *fsnotify.FileEvent, 200) //collect 10 error watcher.Error = make(chan error, 20) obsWatcher := &observerWatcher{o, watcher, abspath} n.watchers = append(n.watchers, obsWatcher) var ignoreObserver IgnoreObserver = nil var isIgnoreObserver bool ignoreObserver, isIgnoreObserver = o.(IgnoreObserver) watcher.Watch(abspath) err = filepath.Walk(abspath, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() { return nil } if isIgnoreObserver { if info.IsDir() && ignoreObserver.IgnoreDir(info) { return filepath.SkipDir } } watcher.Watch(path) return nil }) if err != nil { ERROR.Println("watch error:", err) } } }