From 84ac08fa998ab9ab79b1a4aabf451a53544b503d Mon Sep 17 00:00:00 2001 From: John Date: Mon, 3 Sep 2018 23:28:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9Bgarray=E5=8C=85=EF=BC=8Cgcach?= =?UTF-8?q?e=E6=96=B0=E5=A2=9EContains/SetIfNotExist=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO | 3 +- g/container/garray/garray_int.go | 4 +- g/container/garray/garray_interface.go | 4 +- g/container/garray/garray_sorted_int.go | 35 ++++++++-------- g/container/garray/garray_sorted_interface.go | 35 ++++++++-------- g/container/garray/garray_sorted_string.go | 40 ++++++++++--------- g/container/garray/garray_string.go | 4 +- g/os/gcache/gcache.go | 15 +++++++ g/util/gvalid/gvalid.go | 6 +-- geg/other/test.go | 9 +---- 10 files changed, 87 insertions(+), 68 deletions(-) diff --git a/TODO b/TODO index 4741eb126..67db2d300 100644 --- a/TODO +++ b/TODO @@ -23,7 +23,8 @@ ghttp日志增加客户端IP信息; ghttp.Client自动Close机制; gvalid校验支持当第一个规则失败后便不再校验后续的规则,最好做成链式操作; 检查ghttp.Server超时问题; - +gvalid增加支持对[]rune的长度校验(一个中文占3个字节); +ghttp.Request增加对输入参数的自动HtmlEncode机制; diff --git a/g/container/garray/garray_int.go b/g/container/garray/garray_int.go index 7384c3844..eca08d59e 100644 --- a/g/container/garray/garray_int.go +++ b/g/container/garray/garray_int.go @@ -60,9 +60,9 @@ func (a *IntArray) Remove(index int) { } // 追加数据项 -func (a *IntArray) Append(value int) { +func (a *IntArray) Append(value...int) { a.mu.Lock() - a.array = append(a.array, value) + a.array = append(a.array, value...) a.mu.Unlock() } diff --git a/g/container/garray/garray_interface.go b/g/container/garray/garray_interface.go index bb3166362..65d3fe822 100644 --- a/g/container/garray/garray_interface.go +++ b/g/container/garray/garray_interface.go @@ -59,9 +59,9 @@ func (a *Array) Remove(index int) { } // 追加数据项 -func (a *Array) Append(value interface{}) { +func (a *Array) Append(value...interface{}) { a.mu.Lock() - a.array = append(a.array, value) + a.array = append(a.array, value...) a.mu.Unlock() } diff --git a/g/container/garray/garray_sorted_int.go b/g/container/garray/garray_sorted_int.go index a8a68bb1c..b8322236d 100644 --- a/g/container/garray/garray_sorted_int.go +++ b/g/container/garray/garray_sorted_int.go @@ -45,26 +45,29 @@ func NewSortedIntArray(size int, cap ... int) *SortedIntArray { } // 添加加数据项 -func (a *SortedIntArray) Add(value int) { - index, cmp := a.Search(value) - if a.unique.Val() && cmp == 0 { +func (a *SortedIntArray) Add(values...int) { + if len(values) == 0 { return } - if index < 0 { + for _, value := range values { + index, cmp := a.Search(value) + if a.unique.Val() && cmp == 0 { + return + } a.mu.Lock() - a.array = append(a.array, value) - a.mu.Unlock() - return + defer a.mu.Unlock() + if index < 0 { + a.array = append(a.array, value) + return + } + // 加到指定索引后面 + if cmp > 0 { + index++ + } + rear := append([]int{}, a.array[index : ]...) + a.array = append(a.array[0 : index], value) + a.array = append(a.array, rear...) } - // 加到指定索引后面 - if cmp > 0 { - index++ - } - a.mu.Lock() - rear := append([]int{}, a.array[index : ]...) - a.array = append(a.array[0 : index], value) - a.array = append(a.array, rear...) - a.mu.Unlock() } // 获取指定索引的数据项, 调用方注意判断数组边界 diff --git a/g/container/garray/garray_sorted_interface.go b/g/container/garray/garray_sorted_interface.go index 5dba9b570..3e75f97f1 100644 --- a/g/container/garray/garray_sorted_interface.go +++ b/g/container/garray/garray_sorted_interface.go @@ -30,26 +30,29 @@ func NewSortedArray(size int, cap int, compareFunc func(v1, v2 interface{}) int) } // 添加加数据项 -func (a *SortedArray) Add(value interface{}) { - index, cmp := a.Search(value) - if a.unique.Val() && cmp == 0 { +func (a *SortedArray) Add(values...interface{}) { + if len(values) == 0 { return } - if index < 0 { + for _, value := range values { + index, cmp := a.Search(value) + if a.unique.Val() && cmp == 0 { + return + } a.mu.Lock() - a.array = append(a.array, value) - a.mu.Unlock() - return + defer a.mu.Unlock() + if index < 0 { + a.array = append(a.array, value) + return + } + // 加到指定索引后面 + if cmp > 0 { + index++ + } + rear := append([]interface{}{}, a.array[index : ]...) + a.array = append(a.array[0 : index], value) + a.array = append(a.array, rear...) } - // 加到指定索引后面 - if cmp > 0 { - index++ - } - a.mu.Lock() - rear := append([]interface{}{}, a.array[index : ]...) - a.array = append(a.array[0 : index], value) - a.array = append(a.array, rear...) - a.mu.Unlock() } // 获取指定索引的数据项, 调用方注意判断数组边界 diff --git a/g/container/garray/garray_sorted_string.go b/g/container/garray/garray_sorted_string.go index 4d7e87391..68062df2a 100644 --- a/g/container/garray/garray_sorted_string.go +++ b/g/container/garray/garray_sorted_string.go @@ -40,26 +40,28 @@ func NewSortedStringArray(size int, cap ... int) *SortedStringArray { } // 添加加数据项 -func (a *SortedStringArray) Add(value string) { - index, cmp := a.Search(value) - if a.unique.Val() && cmp == 0 { - return +func (a *SortedStringArray) Add(values...string) { + if len(values) > 0 { + for _, value := range values { + index, cmp := a.Search(value) + if a.unique.Val() && cmp == 0 { + return + } + a.mu.Lock() + defer a.mu.Unlock() + if index < 0 { + a.array = append(a.array, value) + return + } + // 加到指定索引后面 + if cmp > 0 { + index++ + } + rear := append([]string{}, a.array[index : ]...) + a.array = append(a.array[0 : index], value) + a.array = append(a.array, rear...) + } } - if index < 0 { - a.mu.Lock() - a.array = append(a.array, value) - a.mu.Unlock() - return - } - // 加到指定索引后面 - if cmp > 0 { - index++ - } - a.mu.Lock() - rear := append([]string{}, a.array[index : ]...) - a.array = append(a.array[0 : index], value) - a.array = append(a.array, rear...) - a.mu.Unlock() } // 获取指定索引的数据项, 调用方注意判断数组边界 diff --git a/g/container/garray/garray_string.go b/g/container/garray/garray_string.go index eee00097c..e99ca16b6 100644 --- a/g/container/garray/garray_string.go +++ b/g/container/garray/garray_string.go @@ -62,9 +62,9 @@ func (a *StringArray) Remove(index int) { } // 追加数据项 -func (a *StringArray) Append(value string) { +func (a *StringArray) Append(value...string) { a.mu.Lock() - a.array = append(a.array, value) + a.array = append(a.array, value...) a.mu.Unlock() } diff --git a/g/os/gcache/gcache.go b/g/os/gcache/gcache.go index fc176b9a3..8f6aa6ac6 100644 --- a/g/os/gcache/gcache.go +++ b/g/os/gcache/gcache.go @@ -159,6 +159,16 @@ func (c *Cache) Set(key string, value interface{}, expire int) { c.eventQueue.PushBack(_EventItem{k : key, e : e}) } +// 当键名不存在时写入,并返回true;否则返回false。 +// 常用来做对并发性要求不高的内存锁。 +func (c *Cache) SetIfNotExist(key string, value interface{}, expire int) bool { + if !c.Contains(key) { + c.Set(key, value, expire) + return true + } + return false +} + // 批量设置 func (c *Cache) BatchSet(data map[string]interface{}, expire int) { var e int64 @@ -186,6 +196,11 @@ func (c *Cache) Get(key string) interface{} { return nil } +// 是否存在指定的键名,true表示存在,false表示不存在。 +func (c *Cache) Contains(key string) bool { + return c.Get(key) != nil +} + // 删除指定键值对 func (c *Cache) Remove(key string) { c.Set(key, nil, -1000) diff --git a/g/util/gvalid/gvalid.go b/g/util/gvalid/gvalid.go index 525bfd171..a770085eb 100644 --- a/g/util/gvalid/gvalid.go +++ b/g/util/gvalid/gvalid.go @@ -50,9 +50,9 @@ ipv6 格式:ipv6 说明:IPv mac 格式:mac 说明:MAC地址 url 格式:url 说明:URL domain 格式:domain 说明:域名 -length 格式:length:min,max 说明:参数长度为min到max(长度参数为整形) -min-length 格式:min-length:min 说明:参数长度最小为min(长度参数为整形) -max-length 格式:max-length:max 说明:参数长度最大为max(长度参数为整形) +length 格式:length:min,max 说明:参数长度为min到max(长度参数为整形),注意中文一个汉字占3字节 +min-length 格式:min-length:min 说明:参数长度最小为min(长度参数为整形),注意中文一个汉字占3字节 +max-length 格式:max-length:max 说明:参数长度最大为max(长度参数为整形),注意中文一个汉字占3字节 between 格式:between:min,max 说明:参数大小为min到max(支持整形和浮点类型参数) min 格式:min:min 说明:参数最小为min(支持整形和浮点类型参数) max 格式:max:max 说明:参数最大为max(支持整形和浮点类型参数) diff --git a/geg/other/test.go b/geg/other/test.go index 37fe48e85..16134067b 100644 --- a/geg/other/test.go +++ b/geg/other/test.go @@ -1,14 +1,9 @@ package main import ( - "context" + "fmt" ) func main() { - ctx, cancel := context.WithCancel(nil) - go func() { - for { - - } - }() + fmt.Println(len([]rune("中国人"))) } \ No newline at end of file