github.com/iEvan-lhr/exciting-tool@v0.0.0-20230504054234-8e983f73cdd2/map.go (about) 1 package tools 2 3 import ( 4 "sync" 5 ) 6 7 func Ok(value any, ok bool) any { 8 if ok { 9 return value 10 } 11 return nil 12 } 13 14 type Spider struct { 15 Values any 16 Key []byte 17 Next [255]*Spider 18 sync sync.Mutex 19 reader *String 20 len int 21 } 22 23 func (s *Spider) Add(key any, value any) { 24 spider := s.getWriteSpider(s.reader.coverWrite(key).buf) 25 //log.Println(spider) 26 spider.add(value) 27 } 28 29 func (s *Spider) add(value any) { 30 s.Values = value 31 } 32 33 func (s *Spider) Get(key any) any { 34 return s.getReadSpider(s.reader.coverWrite(key).buf).Values 35 } 36 37 func MakeSpider(key any, value any) *Spider { 38 spider := &Spider{} 39 spider.reader = &String{} 40 spider.Key = spider.reader.Append(key).buf 41 spider.getWriteSpider(spider.Key).add(value) 42 return spider 43 } 44 45 func (s *Spider) getWriteSpider(key []byte) *Spider { 46 temp := s 47 for i := 0; i < len(key); i++ { 48 if i == len(key)-1 { 49 if temp.Next[key[i]] != nil { 50 //位移至新地址 51 trans := temp.Next[key[i]] 52 temp.Next[key[i]] = &Spider{Key: key} 53 s.getWriteSpider(trans.Key).add(trans.Values) 54 s.addLen() 55 return temp.Next[key[i]] 56 } else { 57 s.addLen() 58 temp.Next[key[i]] = &Spider{Key: key} 59 return temp.Next[key[i]] 60 } 61 } 62 if temp.Next[key[i]] == nil { 63 temp.Next[key[i]] = &Spider{Key: key} 64 s.addLen() 65 return temp.Next[key[i]] 66 } else if checkBytes(temp.Next[key[i]].Key, key) { 67 return temp.Next[key[i]] 68 } else { 69 temp = temp.Next[key[i]] 70 } 71 } 72 return nil 73 } 74 75 func (s *Spider) getReadSpider(key []byte) *Spider { 76 temp := s 77 for i := 0; i < len(key); i++ { 78 if temp.Next[key[i]] == nil { 79 return &Spider{} 80 } else if checkBytes(temp.Next[key[i]].Key, key) { 81 return temp.Next[key[i]] 82 } else { 83 temp = temp.Next[key[i]] 84 } 85 } 86 return nil 87 } 88 89 func (s *Spider) addLen() { 90 s.sync.Lock() 91 s.len++ 92 s.sync.Unlock() 93 } 94 95 func (s *Spider) Len() int { 96 return s.len 97 }