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) }