compress "github.com/qydysky/part/compress"
signal "github.com/qydysky/part/signal"
+ s "github.com/qydysky/part/strings"
// "encoding/binary"
)
func IsCancel(e error) bool {
return errors.Is(e, context.Canceled)
}
+
+func ToForm(m map[string]string) (postStr string, contentType string) {
+ var buf strings.Builder
+ sign := s.Rand(0, 30)
+ for k, v := range m {
+ buf.WriteString(`-----------------------------` + sign)
+ buf.WriteString(`Content-Disposition: form-data; name=` + k)
+ buf.WriteString("\n")
+ buf.WriteString(v)
+ buf.WriteString("\n")
+ }
+ buf.WriteString(`-----------------------------` + sign + `--`)
+ return buf.String(), `multipart/form-data; boundary=---------------------------` + sign
+}
var c Map
//set
c.Store(0, 3)
- if v,ok := c.Load(0);ok && v != 3{t.Error(`1`)}
+ if v, ok := c.Load(0); ok && v != 3 {
+ t.Error(`1`)
+ }
//change
c.Store(0, 0)
- if v,ok := c.Load(0);ok && v != 0{t.Error(`2`)}
+ if v, ok := c.Load(0); ok && v != 0 {
+ t.Error(`2`)
+ }
//range
c.Store(1, 1)
- c.Range(func(key,value interface{})(bool){
+ c.Range(func(key, value interface{}) bool {
t.Log(key, value)
- if key.(int) != value.(int) {t.Error(`3`)}
+ if key.(int) != value.(int) {
+ t.Error(`3`)
+ }
return true
})
//del
c.Delete(0)
- if v,ok := c.Load(0);ok && v != nil{t.Error(`4`)}
+ if v, ok := c.Load(0); ok && v != nil {
+ t.Error(`4`)
+ }
t.Log(c.Len())
c.Delete(1)
- if v,ok := c.Load(1);ok && v != nil{t.Error(`6`)}
+ if v, ok := c.Load(1); ok && v != nil {
+ t.Error(`6`)
+ }
t.Log(c.Len())
}
var c Map
var w = &sync.WaitGroup{}
var t = b.N
-
+
w.Add(t)
b.ResetTimer()
for i := 0; i < t; i++ {
w.Done()
}(i)
go func(index int) {
- if t,ok := c.LoadV(index).(int);!ok || t != index && t != index+1{
+ if t, ok := c.LoadV(index).(int); !ok || t != index && t != index+1 {
b.Error(`E`, index, t)
}
w.Done()
w.Wait()
}
+func Test_Range(t *testing.T) {
+ var c Map
+ for i := 0; i < 100; i++ {
+ c.Store(i, nil)
+ }
+ if c.Len() != 100 {
+ t.Error("初始化错误", c.Len())
+ }
+ c.Range(func(k, v interface{}) bool {
+ if k == 10 {
+ return true
+ }
+ c.Delete(k)
+ return true
+ })
+ if c.Len() != 1 {
+ t.Error("Delete 无效", c.Len())
+ }
+}
+
func Benchmark_customMap_Range(b *testing.B) {
var c Map
var w = &sync.WaitGroup{}
- var t = 900000//b.N
+ var t = 900000 //b.N
w.Add(t)
b.ResetTimer()
w.Wait()
b.ResetTimer()
- c.Range(func(k,v interface{})(bool){
- if k.(int) != v.(int) {b.Error(`p`)}
+ c.Range(func(k, v interface{}) bool {
+ if k.(int) != v.(int) {
+ b.Error(`p`)
+ }
return true
})
}
func Benchmark_syncMap_Set(b *testing.B) {
- c:=new(sync.Map)
+ c := new(sync.Map)
var w = &sync.WaitGroup{}
w.Add(b.N)
}(i)
}
w.Wait()
- }
+}
- func Benchmark_syncMap_Del(b *testing.B) {
+func Benchmark_syncMap_Del(b *testing.B) {
c := new(sync.Map)
var w = &sync.WaitGroup{}
b.ResetTimer()
for i := 0; i < b.N; i++ {
go func(index int) {
- if v,ok := c.Load(index);!ok || v.(int) != 0 {b.Error("q")}
+ if v, ok := c.Load(index); !ok || v.(int) != 0 {
+ b.Error("q")
+ }
w.Done()
}(i)
}
func Benchmark_syncMap_Range(b *testing.B) {
var c sync.Map
var w = &sync.WaitGroup{}
- var t = 900000//b.N
+ var t = 900000 //b.N
w.Add(t)
b.ResetTimer()
w.Wait()
b.ResetTimer()
- c.Range(func(k,v interface{})(bool){
- if k.(int) != v.(int) {b.Error(`p`)}
+ c.Range(func(k, v interface{}) bool {
+ if k.(int) != v.(int) {
+ b.Error(`p`)
+ }
return true
})
-}
\ No newline at end of file
+}