forked from go/golangs_learn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
972 B
60 lines
972 B
package observer
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/pingcap/log"
|
|
)
|
|
|
|
type Event struct {
|
|
Data int
|
|
}
|
|
|
|
type Observer interface {
|
|
NotifyCallback(event Event)
|
|
}
|
|
|
|
type Subject interface {
|
|
AddListener(observer Observer)
|
|
RemoveListener(observer Observer)
|
|
Notity(event Event)
|
|
}
|
|
|
|
type eventObserver struct {
|
|
ID int
|
|
Time time.Time
|
|
}
|
|
|
|
type eventSubject struct {
|
|
Observer sync.Map
|
|
}
|
|
|
|
func (e *eventObserver) NotityCallback(event Event) {
|
|
log.Info("输出:%s, 之后输出:%s。", event.Data, time.Since(e.Time))
|
|
}
|
|
|
|
func (e *eventSubject) AddListener(observer Observer) {
|
|
e.Observer.Store(observer, struct{}{})
|
|
}
|
|
|
|
func (e *eventSubject) Notity(event Event) {
|
|
e.Observer.Range(func(key, value interface{}) bool {
|
|
if key == nil {
|
|
return false
|
|
}
|
|
key.(Observer).NotifyCallback(event)
|
|
return true
|
|
})
|
|
}
|
|
|
|
func Fib(n int) chan int {
|
|
c := make(chan int)
|
|
go func() {
|
|
defer close(c)
|
|
for i, j := 0, 1; i < n; i, j = i+j, i {
|
|
c <- i
|
|
}
|
|
}()
|
|
return c
|
|
}
|
|
|