gitee.com/h79/goutils@v1.22.10/common/queue/item.go (about) 1 package queue 2 3 import ( 4 "reflect" 5 "time" 6 ) 7 8 // priorityItem 优先级 9 type priorityItem struct { 10 Value any 11 Priority int64 12 } 13 14 func (it *priorityItem) GValue() any { 15 return it.Value 16 } 17 18 func (it *priorityItem) PValue() int64 { 19 return it.Priority 20 } 21 22 type GeneratePriorityFn func() int64 23 24 func WithUnixNano(l *time.Location) GeneratePriorityFn { 25 return func() int64 { 26 return time.Now().In(l).UnixNano() 27 } 28 } 29 30 func NewPriorityItem(elem any, fn GeneratePriorityFn) IPriority { 31 if p, ok := elem.(*priorityItem); ok { 32 return p 33 } 34 if it, ok := elem.(priorityItem); ok { 35 return &it 36 } 37 val := reflect.ValueOf(elem) 38 if val.CanInterface() && val.Type().Implements(PriorityType) { 39 fm := val.Interface().(IPriority) 40 return fm 41 } 42 return &priorityItem{Value: elem, Priority: fn()} 43 }