mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
改进garray包,gcache新增Contains/SetIfNotExist方法
This commit is contained in:
3
TODO
3
TODO
@ -23,7 +23,8 @@ ghttp日志增加客户端IP信息;
|
||||
ghttp.Client自动Close机制;
|
||||
gvalid校验支持当第一个规则失败后便不再校验后续的规则,最好做成链式操作;
|
||||
检查ghttp.Server超时问题;
|
||||
|
||||
gvalid增加支持对[]rune的长度校验(一个中文占3个字节);
|
||||
ghttp.Request增加对输入参数的自动HtmlEncode机制;
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
// 获取指定索引的数据项, 调用方注意判断数组边界
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
// 获取指定索引的数据项, 调用方注意判断数组边界
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
// 获取指定索引的数据项, 调用方注意判断数组边界
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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(支持整形和浮点类型参数)
|
||||
|
||||
@ -1,14 +1,9 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
ctx, cancel := context.WithCancel(nil)
|
||||
go func() {
|
||||
for {
|
||||
|
||||
}
|
||||
}()
|
||||
fmt.Println(len([]rune("中国人")))
|
||||
}
|
||||
Reference in New Issue
Block a user