改进garray包,gcache新增Contains/SetIfNotExist方法

This commit is contained in:
John
2018-09-03 23:28:02 +08:00
parent d6a6ef3c58
commit 84ac08fa99
10 changed files with 87 additions and 68 deletions

3
TODO
View File

@ -23,7 +23,8 @@ ghttp日志增加客户端IP信息
ghttp.Client自动Close机制
gvalid校验支持当第一个规则失败后便不再校验后续的规则最好做成链式操作
检查ghttp.Server超时问题
gvalid增加支持对[]rune的长度校验(一个中文占3个字节)
ghttp.Request增加对输入参数的自动HtmlEncode机制

View File

@ -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()
}

View File

@ -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()
}

View File

@ -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()
}
// 获取指定索引的数据项, 调用方注意判断数组边界

View File

@ -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()
}
// 获取指定索引的数据项, 调用方注意判断数组边界

View File

@ -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()
}
// 获取指定索引的数据项, 调用方注意判断数组边界

View File

@ -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()
}

View File

@ -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)

View File

@ -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(支持整形和浮点类型参数)

View File

@ -1,14 +1,9 @@
package main
import (
"context"
"fmt"
)
func main() {
ctx, cancel := context.WithCancel(nil)
go func() {
for {
}
}()
fmt.Println(len([]rune("中国人")))
}