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 }