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  }