github.com/PandaGoAdmin/utils@v0.0.0-20211208134815-d5461603a00f/convert.go (about)

     1  package kgo
     2  
     3  import (
     4  	"encoding/binary"
     5  	"encoding/hex"
     6  	"fmt"
     7  	"math"
     8  	"net"
     9  	"reflect"
    10  	"strconv"
    11  )
    12  
    13  // Struct2Map 结构体转为字典;tagName为要导出的标签名,可以为空,为空时将导出所有字段.
    14  func (kc *LkkConvert) Struct2Map(obj interface{}, tagName string) (map[string]interface{}, error) {
    15  	return struct2Map(obj, tagName)
    16  }
    17  
    18  // Int2Str 将整数转换为字符串.
    19  func (kc *LkkConvert) Int2Str(val interface{}) string {
    20  	switch val.(type) {
    21  	case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
    22  		return fmt.Sprintf("%d", val)
    23  	default:
    24  		r := reflect.ValueOf(val)
    25  		switch r.Kind() {
    26  		case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int, reflect.Int64, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint, reflect.Uint64:
    27  			return fmt.Sprintf("%d", r.Int())
    28  		default:
    29  			return ""
    30  		}
    31  	}
    32  }
    33  
    34  // Float2Str 将浮点数转换为字符串,decimal为小数位数.
    35  func (kc *LkkConvert) Float2Str(val interface{}, decimal int) string {
    36  	if decimal <= 0 {
    37  		decimal = 2
    38  	}
    39  	switch val.(type) {
    40  	case float32:
    41  		return strconv.FormatFloat(float64(val.(float32)), 'f', decimal, 32)
    42  	case float64:
    43  		return strconv.FormatFloat(val.(float64), 'f', decimal, 64)
    44  	default:
    45  		r := reflect.ValueOf(val)
    46  		switch r.Kind() {
    47  		case reflect.Float32:
    48  			return strconv.FormatFloat(r.Float(), 'f', decimal, 32)
    49  		case reflect.Float64:
    50  			return strconv.FormatFloat(r.Float(), 'f', decimal, 64)
    51  		default:
    52  			return ""
    53  		}
    54  	}
    55  }
    56  
    57  // Bool2Str 将布尔值转换为字符串.
    58  func (kc *LkkConvert) Bool2Str(val bool) string {
    59  	if val {
    60  		return "true"
    61  	}
    62  	return "false"
    63  }
    64  
    65  // Bool2Int 将布尔值转换为整型.
    66  func (kc *LkkConvert) Bool2Int(val bool) int {
    67  	if val {
    68  		return 1
    69  	}
    70  	return 0
    71  }
    72  
    73  // Str2Int 将字符串转换为int.其中"true", "TRUE", "True"为1;若为浮点字符串,则取整数部分.
    74  func (kc *LkkConvert) Str2Int(val string) int {
    75  	return str2Int(val)
    76  }
    77  
    78  // Str2Int8 将字符串转换为int8.
    79  func (kc *LkkConvert) Str2Int8(val string) int8 {
    80  	res, _ := strconv.ParseInt(val, 0, 8)
    81  	return int8(res)
    82  }
    83  
    84  // Str2Int16 将字符串转换为int16.
    85  func (kc *LkkConvert) Str2Int16(val string) int16 {
    86  	res, _ := strconv.ParseInt(val, 0, 16)
    87  	return int16(res)
    88  }
    89  
    90  // Str2Int32 将字符串转换为int32.
    91  func (kc *LkkConvert) Str2Int32(val string) int32 {
    92  	res, _ := strconv.ParseInt(val, 0, 32)
    93  	return int32(res)
    94  }
    95  
    96  // Str2Int64 将字符串转换为int64.
    97  func (kc *LkkConvert) Str2Int64(val string) int64 {
    98  	res, _ := strconv.ParseInt(val, 0, 64)
    99  	return res
   100  }
   101  
   102  // Str2Uint 将字符串转换为uint.其中"true", "TRUE", "True"为1;若为浮点字符串,则取整数部分;若为负值则取0.
   103  func (kc *LkkConvert) Str2Uint(val string) uint {
   104  	return str2Uint(val)
   105  }
   106  
   107  // Str2Uint8 将字符串转换为uint8.
   108  func (kc *LkkConvert) Str2Uint8(val string) uint8 {
   109  	res, _ := strconv.ParseUint(val, 0, 8)
   110  	return uint8(res)
   111  }
   112  
   113  // Str2Uint16 将字符串转换为uint16.
   114  func (kc *LkkConvert) Str2Uint16(val string) uint16 {
   115  	res, _ := strconv.ParseUint(val, 0, 16)
   116  	return uint16(res)
   117  }
   118  
   119  // Str2Uint32 将字符串转换为uint32.
   120  func (kc *LkkConvert) Str2Uint32(val string) uint32 {
   121  	res, _ := strconv.ParseUint(val, 0, 32)
   122  	return uint32(res)
   123  }
   124  
   125  // Str2Uint64 将字符串转换为uint64.
   126  func (kc *LkkConvert) Str2Uint64(val string) uint64 {
   127  	res, _ := strconv.ParseUint(val, 0, 64)
   128  	return res
   129  }
   130  
   131  // Str2Float32 将字符串转换为float32;其中"true", "TRUE", "True"为1.0 .
   132  func (kc *LkkConvert) Str2Float32(val string) float32 {
   133  	return str2Float32(val)
   134  }
   135  
   136  // Str2Float64 将字符串转换为float64;其中"true", "TRUE", "True"为1.0 .
   137  func (kc *LkkConvert) Str2Float64(val string) float64 {
   138  	return str2Float64(val)
   139  }
   140  
   141  // Str2Bool 将字符串转换为布尔值.
   142  // 1, t, T, TRUE, true, True 等字符串为真;
   143  // 0, f, F, FALSE, false, False 等字符串为假.
   144  func (kc *LkkConvert) Str2Bool(val string) bool {
   145  	return str2Bool(val)
   146  }
   147  
   148  // Str2Bytes 将字符串转换为字节切片.
   149  func (kc *LkkConvert) Str2Bytes(val string) []byte {
   150  	return str2Bytes(val)
   151  }
   152  
   153  // Bytes2Str 将字节切片转换为字符串.
   154  func (kc *LkkConvert) Bytes2Str(val []byte) string {
   155  	return bytes2Str(val)
   156  }
   157  
   158  // Str2BytesUnsafe (非安全的)将字符串转换为字节切片.
   159  // 该方法零拷贝,但不安全.它直接转换底层指针,两者指向的相同的内存,改一个另外一个也会变.
   160  // 仅当临时需将长字符串转换且不长时间保存时可以使用.
   161  // 转换之后若没做其他操作直接改变里面的字符,则程序会崩溃.
   162  // 如 b:=Str2BytesUnsafe("xxx"); b[1]='d'; 程序将panic.
   163  func (kc *LkkConvert) Str2BytesUnsafe(val string) []byte {
   164  	return str2BytesUnsafe(val)
   165  }
   166  
   167  // Bytes2StrUnsafe (非安全的)将字节切片转换为字符串.
   168  // 零拷贝,不安全.效率是string([]byte{})的百倍以上,且转换量越大效率优势越明显.
   169  func (kc *LkkConvert) Bytes2StrUnsafe(val []byte) string {
   170  	return bytes2StrUnsafe(val)
   171  }
   172  
   173  // Dec2Bin 将十进制转换为二进制字符串.
   174  func (kc *LkkConvert) Dec2Bin(num int64) string {
   175  	return dec2Bin(num)
   176  }
   177  
   178  // Bin2Dec 将二进制字符串转换为十进制.
   179  func (kc *LkkConvert) Bin2Dec(str string) (int64, error) {
   180  	return bin2Dec(str)
   181  }
   182  
   183  // Hex2Bin 将十六进制字符串转换为二进制字符串.
   184  func (kc *LkkConvert) Hex2Bin(str string) (string, error) {
   185  	return hex2Bin(str)
   186  }
   187  
   188  // Bin2Hex 将二进制字符串转换为十六进制字符串.
   189  func (kc *LkkConvert) Bin2Hex(str string) (string, error) {
   190  	return bin2Hex(str)
   191  }
   192  
   193  // Dec2Hex 将十进制转换为十六进制.
   194  func (kc *LkkConvert) Dec2Hex(num int64) string {
   195  	return dec2Hex(num)
   196  }
   197  
   198  // Hex2Dec 将十六进制转换为十进制.
   199  func (kc *LkkConvert) Hex2Dec(str string) (int64, error) {
   200  	return hex2Dec(str)
   201  }
   202  
   203  // Dec2Oct 将十进制转换为八进制.
   204  func (kc *LkkConvert) Dec2Oct(num int64) string {
   205  	return dec2Oct(num)
   206  }
   207  
   208  // Oct2Dec 将八进制转换为十进制.
   209  func (kc *LkkConvert) Oct2Dec(str string) (int64, error) {
   210  	return oct2Dec(str)
   211  }
   212  
   213  // Runes2Bytes 将[]rune转为[]byte.
   214  func (kc *LkkConvert) Runes2Bytes(rs []rune) []byte {
   215  	return runes2Bytes(rs)
   216  }
   217  
   218  // BaseConvert 进制转换,在任意进制之间转换数字.
   219  // num为输入数值,frombase为原进制,tobase为结果进制.
   220  func (kc *LkkConvert) BaseConvert(num string, frombase, tobase int) (string, error) {
   221  	i, err := strconv.ParseInt(num, frombase, 0)
   222  	if err != nil {
   223  		return "", err
   224  	}
   225  	return strconv.FormatInt(i, tobase), nil
   226  }
   227  
   228  // Ip2Long 将 IPV4 的字符串互联网协议转换成长整型数字.
   229  func (kc *LkkConvert) Ip2Long(ipAddress string) uint32 {
   230  	ip := net.ParseIP(ipAddress)
   231  	if ip == nil {
   232  		return 0
   233  	}
   234  	return binary.BigEndian.Uint32(ip.To4())
   235  }
   236  
   237  // Long2Ip 将长整型转化为字符串形式带点的互联网标准格式地址(IPV4).
   238  func (kc *LkkConvert) Long2Ip(properAddress uint32) string {
   239  	ipByte := make([]byte, 4)
   240  	binary.BigEndian.PutUint32(ipByte, properAddress)
   241  	ip := net.IP(ipByte)
   242  	return ip.String()
   243  }
   244  
   245  // ToStr 强制将变量转换为字符串.
   246  func (kc *LkkConvert) ToStr(val interface{}) string {
   247  	return toStr(val)
   248  }
   249  
   250  // ToBool 强制将变量转换为布尔值.
   251  // 数值类型将检查值是否>0;
   252  // 字符串将使用Str2Bool;
   253  // 数组、切片、字典、通道类型将检查它们的长度是否>0;
   254  // 指针、结构体类型为true,其他为false.
   255  func (kc *LkkConvert) ToBool(val interface{}) bool {
   256  	return toBool(val)
   257  }
   258  
   259  // ToInt 强制将变量转换为整型.
   260  // 数值类型将转为整型;
   261  // 字符串类型将使用Str2Int;
   262  // 布尔型的true为1,false为0;
   263  // 数组、切片、字典、通道类型将取它们的长度;
   264  // 指针、结构体类型为1,其他为0.
   265  func (kc *LkkConvert) ToInt(val interface{}) int {
   266  	return toInt(val)
   267  }
   268  
   269  // ToFloat 强制将变量转换为浮点型.
   270  // 数值类型将转为浮点型;
   271  // 字符串将使用Str2Float64;
   272  // 布尔型的true为1.0,false为0;
   273  // 数组、切片、字典、通道类型将取它们的长度;
   274  // 指针、结构体类型为1.0,其他为0.
   275  func (kc *LkkConvert) ToFloat(val interface{}) (res float64) {
   276  	return toFloat(val)
   277  }
   278  
   279  // Float64ToByte 64位浮点数转字节切片.
   280  func (kc *LkkConvert) Float64ToByte(val float64) []byte {
   281  	bits := math.Float64bits(val)
   282  	res := make([]byte, 8)
   283  	binary.LittleEndian.PutUint64(res, bits)
   284  
   285  	return res
   286  }
   287  
   288  // Byte2Float64 字节切片转64位浮点数.
   289  func (kc *LkkConvert) Byte2Float64(bytes []byte) float64 {
   290  	bits := binary.LittleEndian.Uint64(bytes)
   291  
   292  	return math.Float64frombits(bits)
   293  }
   294  
   295  // Int64ToByte 64位整型转字节切片.
   296  func (kc *LkkConvert) Int64ToByte(val int64) []byte {
   297  	res := make([]byte, 8)
   298  	binary.BigEndian.PutUint64(res, uint64(val))
   299  
   300  	return res
   301  }
   302  
   303  // Byte2Int64 字节切片转64位整型.
   304  func (kc *LkkConvert) Byte2Int64(val []byte) int64 {
   305  	return int64(binary.BigEndian.Uint64(val))
   306  }
   307  
   308  // Byte2Hex 字节切片转16进制字符串.
   309  func (kc *LkkConvert) Byte2Hex(val []byte) string {
   310  	return hex.EncodeToString(val)
   311  }
   312  
   313  // Byte2Hexs 字节切片转16进制切片.
   314  func (kc *LkkConvert) Byte2Hexs(val []byte) []byte {
   315  	dst := make([]byte, hex.EncodedLen(len(val)))
   316  	hex.Encode(dst, val)
   317  	return dst
   318  }
   319  
   320  // Hex2Byte 16进制字符串转字节切片.
   321  func (kc *LkkConvert) Hex2Byte(str string) []byte {
   322  	h, _ := hex2Byte(str)
   323  	return h
   324  }
   325  
   326  // Hexs2Byte 16进制切片转byte切片.
   327  func (kc *LkkConvert) Hexs2Byte(val []byte) []byte {
   328  	dst := make([]byte, hex.DecodedLen(len(val)))
   329  	_, err := hex.Decode(dst, val)
   330  
   331  	if err != nil {
   332  		return nil
   333  	}
   334  	return dst
   335  }
   336  
   337  // IsString 变量是否字符串.
   338  func (kc *LkkConvert) IsString(val interface{}) bool {
   339  	return isString(val)
   340  }
   341  
   342  // IsBinary 字符串是否二进制.
   343  func (kc *LkkConvert) IsBinary(s string) bool {
   344  	return isBinary(s)
   345  }
   346  
   347  // IsNumeric 变量是否数值(不包含复数和科学计数法).
   348  func (kc *LkkConvert) IsNumeric(val interface{}) bool {
   349  	return isNumeric(val)
   350  }
   351  
   352  // IsInt 变量是否整型数值.
   353  func (kc *LkkConvert) IsInt(val interface{}) bool {
   354  	return isInt(val)
   355  }
   356  
   357  // IsFloat 变量是否浮点数值.
   358  func (kc *LkkConvert) IsFloat(val interface{}) bool {
   359  	return isFloat(val)
   360  }
   361  
   362  // IsEmpty 变量是否为空.
   363  func (kc *LkkConvert) IsEmpty(val interface{}) bool {
   364  	return isEmpty(val)
   365  }
   366  
   367  // IsNil 变量是否nil.
   368  func (kc *LkkConvert) IsNil(val interface{}) bool {
   369  	return isNil(val)
   370  }
   371  
   372  // IsBool 是否布尔值.
   373  func (kc *LkkConvert) IsBool(val interface{}) bool {
   374  	return isBool(val)
   375  }
   376  
   377  // IsHex 是否十六进制字符串.
   378  func (kc *LkkConvert) IsHex(str string) bool {
   379  	return isHex(str)
   380  }
   381  
   382  // IsByte 变量是否字节切片.
   383  func (kc *LkkConvert) IsByte(val interface{}) bool {
   384  	return isByte(val)
   385  }
   386  
   387  // IsStruct 变量是否结构体.
   388  func (kc *LkkConvert) IsStruct(val interface{}) bool {
   389  	return isStruct(val)
   390  }
   391  
   392  // IsInterface 变量是否接口.
   393  func (kc *LkkConvert) IsInterface(val interface{}) bool {
   394  	return isInterface(val)
   395  }
   396  
   397  // IsPort 变量值是否端口号(1~65535).
   398  func (kc *LkkConvert) IsPort(val interface{}) bool {
   399  	return isPort(val)
   400  }