Files
convx/to_string.go
2025-09-02 15:43:26 +08:00

92 lines
2.0 KiB
Go

package convx
import (
"encoding/json"
"fmt"
"reflect"
"strconv"
"time"
)
// interface 转 string
// InterfaceToString 将任意interface转换为string
func ToString(v interface{}) string {
if v == nil {
return ""
}
// 获取值的反射对象
val := reflect.ValueOf(v)
// 处理指针类型:解引用直到获取到非指针值
for val.Kind() == reflect.Ptr {
if val.IsNil() {
return ""
}
val = val.Elem()
}
// 获取解引用后的实际值
actualValue := val.Interface()
// 根据具体类型进行处理
switch actual := actualValue.(type) {
case string:
return actual
case []byte:
return string(actual)
case error:
return actual.Error()
case bool:
return strconv.FormatBool(actual)
case int:
return strconv.Itoa(actual)
case int8:
return strconv.FormatInt(int64(actual), 10)
case int16:
return strconv.FormatInt(int64(actual), 10)
case int32:
return strconv.FormatInt(int64(actual), 10)
case int64:
return strconv.FormatInt(actual, 10)
case uint:
return strconv.FormatUint(uint64(actual), 10)
case uint8:
return strconv.FormatUint(uint64(actual), 10)
case uint16:
return strconv.FormatUint(uint64(actual), 10)
case uint32:
return strconv.FormatUint(uint64(actual), 10)
case uint64:
return strconv.FormatUint(actual, 10)
case float32:
return strconv.FormatFloat(float64(actual), 'f', -1, 32)
case float64:
return strconv.FormatFloat(actual, 'f', -1, 64)
case complex64:
return fmt.Sprint(actual)
case complex128:
return fmt.Sprint(actual)
case time.Time:
return actual.Format(time.RFC3339)
case time.Duration:
return actual.String()
case fmt.Stringer:
return actual.String()
}
// 处理切片、数组、map、结构体等复杂类型 - 使用JSON序列化
if val.IsValid() {
switch val.Kind() {
case reflect.Slice, reflect.Array, reflect.Map, reflect.Struct:
jsonBytes, err := json.Marshal(actualValue)
if err == nil {
return string(jsonBytes)
}
}
}
// 默认处理:使用fmt.Sprint
return fmt.Sprint(actualValue)
}