mirror of
https://gitee.com/johng/gf
synced 2026-06-25 09:15:41 +08:00
并发安全容器新增LockFunc/RLockFunc方法,完善Iterator遍历方法注释
This commit is contained in:
@ -9,8 +9,8 @@
|
||||
package glist
|
||||
|
||||
import (
|
||||
"container/list"
|
||||
"sync"
|
||||
"container/list"
|
||||
)
|
||||
|
||||
// 变长双向链表
|
||||
|
||||
@ -33,7 +33,7 @@ func (this *IntBoolMap) Clone() *map[int]bool {
|
||||
return &m
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *IntBoolMap) Iterator(f func (k int, v bool) bool) {
|
||||
this.mu.RLock()
|
||||
for k, v := range this.m {
|
||||
@ -160,3 +160,16 @@ func (this *IntBoolMap) Clear() {
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (this *IntBoolMap) LockFunc(f func(m map[int]bool)) {
|
||||
this.mu.Lock()
|
||||
f(this.m)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (this *IntBoolMap) RLockFunc(f func(m map[int]bool)) {
|
||||
this.mu.RLock()
|
||||
f(this.m)
|
||||
this.mu.RUnlock()
|
||||
}
|
||||
@ -22,7 +22,7 @@ func NewIntIntMap() *IntIntMap {
|
||||
}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *IntIntMap) Iterator(f func (k int, v int) bool) {
|
||||
this.mu.RLock()
|
||||
for k, v := range this.m {
|
||||
@ -160,3 +160,16 @@ func (this *IntIntMap) Clear() {
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (this *IntIntMap) LockFunc(f func(m map[int]int)) {
|
||||
this.mu.Lock()
|
||||
f(this.m)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (this *IntIntMap) RLockFunc(f func(m map[int]int)) {
|
||||
this.mu.RLock()
|
||||
f(this.m)
|
||||
this.mu.RUnlock()
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ func NewIntInterfaceMap() *IntInterfaceMap {
|
||||
}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *IntInterfaceMap) Iterator(f func (k int, v interface{}) bool) {
|
||||
this.mu.RLock()
|
||||
for k, v := range this.m {
|
||||
@ -185,3 +185,16 @@ func (this *IntInterfaceMap) Clear() {
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (this *IntInterfaceMap) LockFunc(f func(m map[int]interface{})) {
|
||||
this.mu.Lock()
|
||||
f(this.m)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (this *IntInterfaceMap) RLockFunc(f func(m map[int]interface{})) {
|
||||
this.mu.RLock()
|
||||
f(this.m)
|
||||
this.mu.RUnlock()
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@ func NewIntStringMap() *IntStringMap {
|
||||
}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *IntStringMap) Iterator(f func (k int, v string) bool) {
|
||||
this.mu.RLock()
|
||||
for k, v := range this.m {
|
||||
@ -160,3 +160,16 @@ func (this *IntStringMap) Clear() {
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (this *IntStringMap) LockFunc(f func(m map[int]string)) {
|
||||
this.mu.Lock()
|
||||
f(this.m)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (this *IntStringMap) RLockFunc(f func(m map[int]string)) {
|
||||
this.mu.RLock()
|
||||
f(this.m)
|
||||
this.mu.RUnlock()
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ func NewInterfaceInterfaceMap() *InterfaceInterfaceMap {
|
||||
}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *InterfaceInterfaceMap) Iterator(f func (k interface{}, v interface{}) bool) {
|
||||
this.mu.RLock()
|
||||
for k, v := range this.m {
|
||||
@ -184,3 +184,17 @@ func (this *InterfaceInterfaceMap) Clear() {
|
||||
this.m = make(map[interface{}]interface{})
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (this *InterfaceInterfaceMap) LockFunc(f func(m map[interface{}]interface{})) {
|
||||
this.mu.Lock()
|
||||
f(this.m)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (this *InterfaceInterfaceMap) RLockFunc(f func(m map[interface{}]interface{})) {
|
||||
this.mu.RLock()
|
||||
f(this.m)
|
||||
this.mu.RUnlock()
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@ func NewStringBoolMap() *StringBoolMap {
|
||||
}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *StringBoolMap) Iterator(f func (k string, v bool) bool) {
|
||||
this.mu.RLock()
|
||||
for k, v := range this.m {
|
||||
@ -159,3 +159,17 @@ func (this *StringBoolMap) Clear() {
|
||||
this.m = make(map[string]bool)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (this *StringBoolMap) LockFunc(f func(m map[string]bool)) {
|
||||
this.mu.Lock()
|
||||
f(this.m)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (this *StringBoolMap) RLockFunc(f func(m map[string]bool)) {
|
||||
this.mu.RLock()
|
||||
f(this.m)
|
||||
this.mu.RUnlock()
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@ func NewStringIntMap() *StringIntMap {
|
||||
}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *StringIntMap) Iterator(f func (k string, v int) bool) {
|
||||
this.mu.RLock()
|
||||
for k, v := range this.m {
|
||||
@ -160,3 +160,16 @@ func (this *StringIntMap) Clear() {
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (this *StringIntMap) LockFunc(f func(m map[string]int)) {
|
||||
this.mu.Lock()
|
||||
f(this.m)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (this *StringIntMap) RLockFunc(f func(m map[string]int)) {
|
||||
this.mu.RLock()
|
||||
f(this.m)
|
||||
this.mu.RUnlock()
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ func NewStringInterfaceMap() *StringInterfaceMap {
|
||||
}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *StringInterfaceMap) Iterator(f func (k string, v interface{}) bool) {
|
||||
this.mu.RLock()
|
||||
for k, v := range this.m {
|
||||
@ -184,3 +184,17 @@ func (this *StringInterfaceMap) Clear() {
|
||||
this.m = make(map[string]interface{})
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (this *StringInterfaceMap) LockFunc(f func(m map[string]interface{})) {
|
||||
this.mu.Lock()
|
||||
f(this.m)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (this *StringInterfaceMap) RLockFunc(f func(m map[string]interface{})) {
|
||||
this.mu.RLock()
|
||||
f(this.m)
|
||||
this.mu.RUnlock()
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@ func NewStringStringMap() *StringStringMap {
|
||||
}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *StringStringMap) Iterator(f func (k string, v string) bool) {
|
||||
this.mu.RLock()
|
||||
for k, v := range this.m {
|
||||
@ -159,3 +159,17 @@ func (this *StringStringMap) Clear() {
|
||||
this.m = make(map[string]string)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (this *StringStringMap) LockFunc(f func(m map[string]string)) {
|
||||
this.mu.Lock()
|
||||
f(this.m)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (this *StringStringMap) RLockFunc(f func(m map[string]string)) {
|
||||
this.mu.RLock()
|
||||
f(this.m)
|
||||
this.mu.RUnlock()
|
||||
}
|
||||
|
||||
@ -184,3 +184,16 @@ func (this *UintInterfaceMap) Clear() {
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (this *UintInterfaceMap) LockFunc(f func(m map[uint]interface{})) {
|
||||
this.mu.Lock()
|
||||
f(this.m)
|
||||
this.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (this *UintInterfaceMap) RLockFunc(f func(m map[uint]interface{})) {
|
||||
this.mu.RLock()
|
||||
f(this.m)
|
||||
this.mu.RUnlock()
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@ func NewIntSet() *IntSet {
|
||||
return &IntSet{m: make(map[int]struct{})}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *IntSet) Iterator(f func (v int) bool) {
|
||||
this.mu.RLock()
|
||||
for k, _ := range this.m {
|
||||
|
||||
@ -21,7 +21,7 @@ func NewInterfaceSet() *InterfaceSet {
|
||||
return &InterfaceSet{m: make(map[interface{}]struct{})}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *InterfaceSet) Iterator(f func (v interface{}) bool) {
|
||||
this.mu.RLock()
|
||||
for k, _ := range this.m {
|
||||
|
||||
@ -21,7 +21,7 @@ func NewStringSet() *StringSet {
|
||||
return &StringSet{m: make(map[string]struct{})}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *StringSet) Iterator(f func (v string) bool) {
|
||||
this.mu.RLock()
|
||||
for k, _ := range this.m {
|
||||
|
||||
@ -21,7 +21,7 @@ func NewUintSet() *UintSet {
|
||||
return &UintSet{m: make(map[uint]struct{})}
|
||||
}
|
||||
|
||||
// 给定回调函数对原始内容进行遍历
|
||||
// 给定回调函数对原始内容进行遍历,回调函数返回true表示继续遍历,否则停止遍历
|
||||
func (this *UintSet) Iterator(f func (v uint) bool) {
|
||||
this.mu.RLock()
|
||||
for k, _ := range this.m {
|
||||
|
||||
@ -34,3 +34,17 @@ func (t *Bytes)Val() []byte {
|
||||
t.mu.RUnlock()
|
||||
return b
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (t *Bytes) LockFunc(f func(value []byte) []byte) {
|
||||
t.mu.Lock()
|
||||
t.val = f(t.val)
|
||||
t.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (t *Bytes) RLockFunc(f func(value []byte)) {
|
||||
t.mu.RLock()
|
||||
f(t.val)
|
||||
t.mu.RUnlock()
|
||||
}
|
||||
@ -10,6 +10,7 @@ import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
// 比较通用的并发安全数据类型
|
||||
type Interface struct {
|
||||
mu sync.RWMutex
|
||||
val interface{}
|
||||
@ -34,3 +35,17 @@ func (t *Interface)Val() interface{} {
|
||||
t.mu.RUnlock()
|
||||
return b
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (t *Interface) LockFunc(f func(value interface{}) interface{}) {
|
||||
t.mu.Lock()
|
||||
t.val = f(t.val)
|
||||
t.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (t *Interface) RLockFunc(f func(value interface{})) {
|
||||
t.mu.RLock()
|
||||
f(t.val)
|
||||
t.mu.RUnlock()
|
||||
}
|
||||
@ -34,3 +34,19 @@ func (t *String)Val() string {
|
||||
t.mu.RUnlock()
|
||||
return s
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁修改操作
|
||||
func (t *String) LockFunc(f func(value string) string) {
|
||||
t.mu.Lock()
|
||||
t.val = f(t.val)
|
||||
t.mu.Unlock()
|
||||
}
|
||||
|
||||
// 使用自定义方法执行加锁读取操作
|
||||
func (t *String) RLockFunc(f func(value string)) {
|
||||
t.mu.RLock()
|
||||
f(t.val)
|
||||
t.mu.RUnlock()
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,26 +1,18 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"gitee.com/johng/gf/g/net/ghttp"
|
||||
"gitee.com/johng/gf/g/frame/gmvc"
|
||||
"gitee.com/johng/gf/g/container/gmap"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type ControllerTemplate struct {
|
||||
gmvc.Controller
|
||||
}
|
||||
|
||||
func (c *ControllerTemplate) Info() {
|
||||
c.View.Assign("name", "john")
|
||||
c.View.Assigns(map[string]interface{}{
|
||||
"age" : 18,
|
||||
"score" : 100,
|
||||
})
|
||||
c.View.Display("user/index.tpl")
|
||||
}
|
||||
|
||||
func main() {
|
||||
s := ghttp.GetServer()
|
||||
s.BindControllerMethod("/template", &ControllerTemplate{}, "Info")
|
||||
s.Run()
|
||||
m := gmap.NewIntBoolMap()
|
||||
m.Set(1, true)
|
||||
fmt.Println(m.Keys())
|
||||
m.LockFunc(func(m map[int]bool) {
|
||||
m[2] = false
|
||||
})
|
||||
fmt.Println(m.Keys())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user