【发布时间】:2021-12-04 07:35:19
【问题描述】:
我有这个功能:
func New(config *WatcherConfig) *Watcher {
instance := &Watcher{
config: config,
connections: make(map[string]ConnectionInfo),
lock: sync.Mutex{},
}
go instance.Start()
return instance
}
它创建了一个Watcher 的新实例,目前有两个WatcherConfig。如您所见,我使用 Go 例程启动了另一个名为 Start() 的函数。
func (w *Watcher) Start() {
fmt.Println(w.config.PathToLogFile)
}
一个WatcherConfig 对于PathToLogFile 的值为/var/log/openvpn.log,另一个WatcherConfig 对于PathToLogFile 的值为/var/log/postfix.log。但是,当我使用 GoRoutine 调用 Start() 函数时,它会打印两次 /var/log/postfix.log。如果我删除 go 例程,就像这样:
func New(config *WatcherConfig) *Watcher {
instance := &Watcher{
config: config,
connections: make(map[string]ConnectionInfo),
lock: sync.Mutex{},
}
instance.Start()
return instance
}
它现在可以正确打印/var/log/openvpn.log 和/var/log/postfix.log。
调用New()的代码
/// ---------
/// Parse config file
/// ---------
configuration, err := config.ParseConfig(*configFileLocation)
if err != nil {
log.Fatalln(err)
}
var watchers []*watcher.Watcher
for _, watcherConfig := range configuration.Watchers {
watchers = append(watchers, watcher.New(&watcherConfig))
}
为什么 go 例程“切换”到另一个实例?
【问题讨论】: