很抱歉,我之前提供的代码中使用了mvccpb
包。这是etcd内部使用的私有协议缓冲区(protobuf)包,不应该在客户端代码中直接使用。
正确的做法是导入etcd客户端库所提供的clientv3/mvccpb
包,并使用其中定义的类型。例如,上面示例代码中可以这样导入:
import (
"fmt"
"context"
"go.etcd.io/etcd/client/v3"
mvccpb "go.etcd.io/etcd/client/v3/mvccpb"
)
然后在事件处理程序中使用mvccpb.Event_EventType
枚举类型,如下所示:
watcher := client.Watch(context.Background(), "/example/key", clientv3.WithPrefix(), clientv3.WithRev(0))
for watchResponse := range watcher {
for _, event := range watchResponse.Events {
switch event.Type {
case mvccpb.Event_PUT:
if len(event.PrevKv.Value) > 0 { // key updated
fmt.Printf("Key updated! OldKey=%s OldValue=%s NewKey=%s NewValue=%s\n", event.PrevKv.Key, event.PrevKv.Value, event.Kv.Key, event.Kv.Value)
} else { // key created
fmt.Printf("Key created! Key=%s Value=%s\n", event.Kv.Key, event.Kv.Value)
}
case mvccpb.Event_DELETE:
fmt.Printf("Key deleted! Key=%s Value=%s\n", event.Kv.Key, event.Kv.Value)
default:
fmt.Println("Unknown Event Type!")
}
}
}
请注意,这里的事件类型是mvccpb.Event_EventType
,而不是我之前错误地使用的mvccpb.PUT
和mvccpb.DELETE
。