github.com/iEvan-lhr/exciting-tool@v0.0.0-20230504054234-8e983f73cdd2/string.go (about) 1 package tools 2 3 import ( 4 "bytes" 5 "errors" 6 "reflect" 7 "time" 8 "unicode/utf8" 9 "unsafe" 10 ) 11 12 const ( 13 TRUE = "true" 14 FALSE = "false" 15 ) 16 17 type String struct { 18 addr *String 19 runes []rune 20 buf []byte 21 } 22 23 // Strings 根据字符串来构建一个String 24 func Strings(str string) *String { 25 s := String{} 26 ReturnValue(s.writeString(str)) 27 s.runes = bytes.Runes(s.buf) 28 return &s 29 } 30 31 // Make 根据指定类型来构建一个String 32 func Make(value ...any) *String { 33 s := &String{} 34 s.Append(value...) 35 return s 36 } 37 38 func BytesString(b []byte) *String { 39 s := String{} 40 ReturnValue(s.Write(b)) 41 s.runes = bytes.Runes(s.buf) 42 return &s 43 } 44 45 // ToString 字符串转型输出 46 func (s *String) String() string { 47 return s.string() 48 } 49 50 // Runes 返回中文支持的字符 51 func (s *String) Runes() []rune { 52 return s.runes 53 } 54 55 // Bytes 返回中文支持的字符 56 func (s *String) Bytes() []byte { 57 return s.buf 58 } 59 60 // Check 检查是否相等 61 func (s *String) Check(str any) bool { 62 switch str.(type) { 63 case *String: 64 if inTF(len(s.buf), str.(*String).Len()) { 65 for i, v := range str.(*String).buf { 66 if s.buf[i] != v { 67 return false 68 } 69 } 70 return true 71 } 72 case string: 73 if inTF(len(s.buf), len(str.(string))) { 74 for i, v := range []byte(str.(string)) { 75 if s.buf[i] != v { 76 return false 77 } 78 } 79 return true 80 } 81 case []byte: 82 if inTF(len(s.buf), len(str.([]byte))) { 83 for i, v := range str.([]byte) { 84 if s.buf[i] != v { 85 return false 86 } 87 } 88 return true 89 } 90 case []rune: 91 if inTF(len(s.runes), len(str.([]rune))) { 92 for i, v := range str.([]rune) { 93 if s.runes[i] != v { 94 return false 95 } 96 } 97 return true 98 } 99 } 100 return false 101 102 } 103 104 // appendAny 拼接字符串 105 func (s *String) appendAny(join any) int { 106 switch join.(type) { 107 case *String: 108 return ReturnValue(s.Write(join.(*String).buf)).(int) 109 case string: 110 return ReturnValue(s.writeString(join.(string))).(int) 111 case []byte: 112 return ReturnValue(s.Write(join.([]byte))).(int) 113 case byte: 114 ReturnValue(s.WriteByte(join.(byte))) 115 return 1 116 case int: 117 return appendInt(join.(int), &s.buf) 118 case int8: 119 return appendInt(int(join.(int8)), &s.buf) 120 case int16: 121 return appendInt(int(join.(int16)), &s.buf) 122 case int32: 123 return appendInt(int(join.(int32)), &s.buf) 124 case int64: 125 return appendInt(int(join.(int64)), &s.buf) 126 case uint: 127 return appendUint64(uint64(join.(uint)), &s.buf) 128 case uint16: 129 return appendUint64(uint64(join.(uint16)), &s.buf) 130 case uint32: 131 return appendUint64(uint64(join.(uint32)), &s.buf) 132 case uint64: 133 return appendUint64(join.(uint64), &s.buf) 134 case float32: 135 l1 := s.Len() 136 genericFtoa(&s.buf, float64(join.(float32)), 'f', 2, 32) 137 return s.Len() - l1 138 case float64: 139 l1 := s.Len() 140 genericFtoa(&s.buf, join.(float64), 'f', 2, 32) 141 return s.Len() - l1 142 case bool: 143 if join.(bool) { 144 return ReturnValue(s.writeString(TRUE)).(int) 145 } else { 146 return ReturnValue(s.writeString(FALSE)).(int) 147 } 148 case time.Time: 149 s.strTime(join.(time.Time)) 150 default: 151 value := reflect.ValueOf(join) 152 switch value.Kind() { 153 case reflect.Struct, reflect.Pointer: 154 if value.MethodByName("String").IsValid() { 155 return ReturnValue(s.writeString(value.MethodByName("String").Call(nil)[0].String())).(int) 156 } else { 157 s.Marshal(join) 158 } 159 case reflect.Slice: 160 for i := 0; i < value.Len(); i++ { 161 s.appendAny(value.Index(i).Interface()) 162 } 163 } 164 } 165 return -1 166 } 167 168 func (s *String) coverWrite(key any) *String { 169 s.buf = nil 170 s.appendAny(key) 171 return s 172 } 173 174 // Append 拼接字符串后返回String 175 func (s *String) Append(join ...any) *String { 176 for i := range join { 177 s.appendAny(join[i]) 178 } 179 return s 180 } 181 182 // AppendLens 拼接字符串后返回String 183 func (s *String) AppendLens(join any) int { 184 return s.appendAny(join) 185 } 186 187 // Index 返回数据中含有字串的下标 没有返回-1 188 func (s *String) Index(str any) int { 189 switch str.(type) { 190 case *String: 191 return bytes.Index(s.buf, str.(*String).buf) 192 case string: 193 return bytes.Index(s.buf, []byte(str.(string))) 194 case []byte: 195 return bytes.Index(s.buf, str.([]byte)) 196 case rune: 197 return s.indexByRune(str.(rune)) 198 } 199 return -1 200 } 201 202 // Split 按照string片段来分割字符串 返回[]string 203 func (s *String) Split(str string) []string { 204 var order []string 205 for _, v := range bytes.Split(s.buf, []byte(str)) { 206 order = append(order, string(v)) 207 } 208 return order 209 } 210 211 // SplitString 按照*String来分割字符串 返回[]*String 212 func (s *String) SplitString(str String) []*String { 213 byt := bytes.Split(s.buf, str.buf) 214 var order []*String 215 for i := range byt { 216 order = append(order, &String{buf: byt[i]}) 217 } 218 return order 219 } 220 221 // FirstUpper 首字母大写 222 func (s *String) FirstUpper() { 223 if s.buf[0] > 90 { 224 s.buf[0] = s.buf[0] - 32 225 } 226 s.runes = bytes.Runes(s.buf) 227 } 228 229 // FirstLower 首字母小写 230 func (s *String) FirstLower() { 231 if s.buf[0] < 97 { 232 s.buf[0] = s.buf[0] + 32 233 } 234 s.runes = bytes.Runes(s.buf) 235 } 236 237 // FirstUpperBackString 首字母大写后返回string 238 func (s *String) FirstUpperBackString() string { 239 s.FirstUpper() 240 return s.string() 241 } 242 243 // FirstLowerBackString 首字母小写后返回string 244 func (s *String) FirstLowerBackString() string { 245 s.FirstLower() 246 return s.string() 247 } 248 249 func noescape(p unsafe.Pointer) unsafe.Pointer { 250 x := uintptr(p) 251 return unsafe.Pointer(x ^ 0) 252 } 253 254 func (s *String) copyCheck() { 255 if s.addr == nil { 256 s.addr = (*String)(noescape(unsafe.Pointer(s))) 257 } else if s.addr != s { 258 panic("strings: illegal use of non-zero String copied by value") 259 } 260 } 261 262 func (s *String) string() string { 263 return *(*string)(unsafe.Pointer(&s.buf)) 264 } 265 266 // Len 返回字符串长度 267 func (s *String) Len() int { return len(s.buf) } 268 269 // LenByRune 返回含有中文的字符串长度 270 func (s *String) LenByRune() int { return len(bytes.Runes(s.buf)) } 271 272 func (s *String) cap() int { return cap(s.buf) } 273 274 func (s *String) reset() { 275 s.addr = nil 276 s.buf = nil 277 } 278 279 func (s *String) grow(n int) { 280 buf := make([]byte, len(s.buf), 2*cap(s.buf)+n) 281 copy(buf, s.buf) 282 s.buf = buf 283 } 284 285 // Grow 扩充大小 286 func (s *String) Grow(n int) { 287 s.copyCheck() 288 if n < 0 { 289 panic("strings.String.Grow: negative count") 290 } 291 if cap(s.buf)-len(s.buf) < n { 292 s.grow(n) 293 } 294 } 295 296 // WriteByte 写入[]Byte的数据 297 func (s *String) Write(p []byte) (int, error) { 298 s.copyCheck() 299 s.buf = append(s.buf, p...) 300 return len(p), nil 301 } 302 303 // WriteByte 写入Byte字符格式的数据 304 func (s *String) WriteByte(c byte) error { 305 s.copyCheck() 306 s.buf = append(s.buf, c) 307 return nil 308 } 309 310 // WriteRune 写入Rune字符格式的数据 311 func (s *String) WriteRune(r rune) (int, error) { 312 s.copyCheck() 313 if r < utf8.RuneSelf { 314 s.buf = append(s.buf, byte(r)) 315 return 1, nil 316 } 317 l := len(s.buf) 318 if cap(s.buf)-l < utf8.UTFMax { 319 s.grow(utf8.UTFMax) 320 } 321 n := utf8.EncodeRune(s.buf[l:l+utf8.UTFMax], r) 322 s.buf = s.buf[:l+n] 323 return n, nil 324 } 325 326 func (s *String) writeString(str string) (int, error) { 327 s.copyCheck() 328 s.buf = append(s.buf, str...) 329 return len(str), nil 330 } 331 332 // RemoveLastStr 从尾部移除固定长度的字符 333 func (s *String) RemoveLastStr(lens int) { 334 if lens > s.Len() { 335 LogError(errors.New("RemoveLens>stringLens Please Check")) 336 return 337 } 338 s.buf = s.buf[:s.Len()-lens] 339 s.runes = bytes.Runes(s.buf) 340 } 341 342 // ReplaceLastStr 从尾部移除固定长度的字符 343 func (s *String) ReplaceLastStr(lens int, str any) { 344 s.buf = s.buf[:s.Len()-lens] 345 s.appendAny(str) 346 s.runes = bytes.Runes(s.buf) 347 } 348 349 // RemoveLastStrByRune 从尾部移除固定长度的字符 并且支持中文字符的移除 350 func (s *String) RemoveLastStrByRune(lens int) { 351 runes := bytes.Runes(s.buf) 352 if lens > len(runes) { 353 LogError(errors.New("RemoveLens>stringLens Please Check")) 354 return 355 } 356 s.buf = runesToBytes(runes[:len(runes)-lens]) 357 } 358 359 // GetByte 获取字符串的单个字符值 360 func (s *String) GetByte(index int) byte { 361 return s.buf[index] 362 } 363 364 // GetStr 获取字符串的某个片段 返回String 365 func (s *String) GetStr(index, end int) string { 366 return string(s.buf[index:end]) 367 } 368 369 // GetStrString 获取字符串的某个片段 返回String结构 370 func (s *String) GetStrString(index, end int) *String { 371 return &String{buf: s.buf[index:end]} 372 } 373 374 // RemoveIndexStr 移除头部固定长度的字符 375 func (s *String) RemoveIndexStr(lens int) { 376 if lens > s.Len() { 377 LogError(errors.New("RemoveLens>stringLens Please Check")) 378 return 379 } 380 s.buf = s.buf[lens:] 381 s.runes = bytes.Runes(s.buf) 382 } 383 384 // RemoveIndexRune 移除头部固定长度的字符(中文支持) 385 func (s *String) RemoveIndexRune(lens int) { 386 if lens > len(s.runes) { 387 LogError(errors.New("RemoveLens>stringLens Please Check")) 388 return 389 } 390 s.runes = s.runes[lens:] 391 s.buf = runesToBytes(s.runes) 392 } 393 394 // CheckIsNull 检查字符串是否为空 只包含' '与'\t'与'\n'都会被视为不合法的值 395 func (s *String) CheckIsNull() bool { 396 for _, b := range s.buf { 397 if b != 32 && b != 9 && b != 10 { 398 return false 399 } 400 } 401 return true 402 } 403 404 func (s *String) indexByRune(r rune) int { 405 if s.runes == nil || len(s.runes) == 0 { 406 s.runes = bytes.Runes(s.buf) 407 } 408 for i := range s.runes { 409 if s.runes[i] == r { 410 return i 411 } 412 } 413 return -1 414 }