From 5494a4d710ff24d620bb89e4fddad44353b30cd6 Mon Sep 17 00:00:00 2001 From: John Date: Sun, 15 Apr 2018 22:02:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=B6=E5=8F=91=E5=AE=89=E5=85=A8=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E6=96=B0=E5=A2=9ELockFunc/RLockFunc=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E5=AE=8C=E5=96=84Iterator=E9=81=8D=E5=8E=86=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/container/glist/glist.go | 2 +- g/container/gmap/int_bool_map.go | 15 ++++++++++- g/container/gmap/int_int_map.go | 15 ++++++++++- g/container/gmap/int_interface_map.go | 15 ++++++++++- g/container/gmap/int_string_map.go | 15 ++++++++++- g/container/gmap/interface_interface_map.go | 16 +++++++++++- g/container/gmap/string_bool_map.go | 16 +++++++++++- g/container/gmap/string_int_map.go | 15 ++++++++++- g/container/gmap/string_interface_map.go | 16 +++++++++++- g/container/gmap/string_string_map.go | 16 +++++++++++- g/container/gmap/uint_interface_map.go | 13 ++++++++++ g/container/gset/int_set.go | 2 +- g/container/gset/interface_set.go | 2 +- g/container/gset/string_set.go | 2 +- g/container/gset/uint_set.go | 2 +- g/container/gtype/bytes.go | 14 +++++++++++ g/container/gtype/interface.go | 15 +++++++++++ g/container/gtype/string.go | 16 ++++++++++++ geg/other/test.go | 28 ++++++++------------- 19 files changed, 203 insertions(+), 32 deletions(-) diff --git a/g/container/glist/glist.go b/g/container/glist/glist.go index ba9592dd5..c531af82b 100644 --- a/g/container/glist/glist.go +++ b/g/container/glist/glist.go @@ -9,8 +9,8 @@ package glist import ( - "container/list" "sync" + "container/list" ) // 变长双向链表 diff --git a/g/container/gmap/int_bool_map.go b/g/container/gmap/int_bool_map.go index 0538876f8..be3fd7f05 100644 --- a/g/container/gmap/int_bool_map.go +++ b/g/container/gmap/int_bool_map.go @@ -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() +} \ No newline at end of file diff --git a/g/container/gmap/int_int_map.go b/g/container/gmap/int_int_map.go index fcb3ddd94..dea27f0e4 100644 --- a/g/container/gmap/int_int_map.go +++ b/g/container/gmap/int_int_map.go @@ -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() +} diff --git a/g/container/gmap/int_interface_map.go b/g/container/gmap/int_interface_map.go index 11d948834..d36eed4e5 100644 --- a/g/container/gmap/int_interface_map.go +++ b/g/container/gmap/int_interface_map.go @@ -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() +} diff --git a/g/container/gmap/int_string_map.go b/g/container/gmap/int_string_map.go index 7302b4298..10b685691 100644 --- a/g/container/gmap/int_string_map.go +++ b/g/container/gmap/int_string_map.go @@ -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() +} diff --git a/g/container/gmap/interface_interface_map.go b/g/container/gmap/interface_interface_map.go index 9b2640aaa..bdea3c174 100644 --- a/g/container/gmap/interface_interface_map.go +++ b/g/container/gmap/interface_interface_map.go @@ -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() +} diff --git a/g/container/gmap/string_bool_map.go b/g/container/gmap/string_bool_map.go index 03915d834..1d9ee2aa2 100644 --- a/g/container/gmap/string_bool_map.go +++ b/g/container/gmap/string_bool_map.go @@ -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() +} diff --git a/g/container/gmap/string_int_map.go b/g/container/gmap/string_int_map.go index cec18e057..17487dfc2 100644 --- a/g/container/gmap/string_int_map.go +++ b/g/container/gmap/string_int_map.go @@ -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() +} diff --git a/g/container/gmap/string_interface_map.go b/g/container/gmap/string_interface_map.go index 0af9fe28a..4dbb6c4ab 100644 --- a/g/container/gmap/string_interface_map.go +++ b/g/container/gmap/string_interface_map.go @@ -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() +} diff --git a/g/container/gmap/string_string_map.go b/g/container/gmap/string_string_map.go index 37f5f88ef..33bea9847 100644 --- a/g/container/gmap/string_string_map.go +++ b/g/container/gmap/string_string_map.go @@ -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() +} diff --git a/g/container/gmap/uint_interface_map.go b/g/container/gmap/uint_interface_map.go index 90f3bc2bc..d3d7fa6a5 100644 --- a/g/container/gmap/uint_interface_map.go +++ b/g/container/gmap/uint_interface_map.go @@ -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() +} diff --git a/g/container/gset/int_set.go b/g/container/gset/int_set.go index ef0d9d8a5..1f380aa72 100644 --- a/g/container/gset/int_set.go +++ b/g/container/gset/int_set.go @@ -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 { diff --git a/g/container/gset/interface_set.go b/g/container/gset/interface_set.go index 216f71cdf..e69ef6933 100644 --- a/g/container/gset/interface_set.go +++ b/g/container/gset/interface_set.go @@ -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 { diff --git a/g/container/gset/string_set.go b/g/container/gset/string_set.go index 7e8a42f99..589cc777b 100644 --- a/g/container/gset/string_set.go +++ b/g/container/gset/string_set.go @@ -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 { diff --git a/g/container/gset/uint_set.go b/g/container/gset/uint_set.go index 884973a2e..d2ca0a577 100644 --- a/g/container/gset/uint_set.go +++ b/g/container/gset/uint_set.go @@ -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 { diff --git a/g/container/gtype/bytes.go b/g/container/gtype/bytes.go index dc266f59e..e5e05b74c 100644 --- a/g/container/gtype/bytes.go +++ b/g/container/gtype/bytes.go @@ -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() +} \ No newline at end of file diff --git a/g/container/gtype/interface.go b/g/container/gtype/interface.go index 2be0dd676..fa57eccc8 100644 --- a/g/container/gtype/interface.go +++ b/g/container/gtype/interface.go @@ -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() +} \ No newline at end of file diff --git a/g/container/gtype/string.go b/g/container/gtype/string.go index 03a573688..b0131dcbb 100644 --- a/g/container/gtype/string.go +++ b/g/container/gtype/string.go @@ -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() +} + + diff --git a/geg/other/test.go b/geg/other/test.go index 1aeebf198..506f6d9dd 100644 --- a/geg/other/test.go +++ b/geg/other/test.go @@ -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()) }