Golang中interface转string输出打印方法
前言
在开发过程中,有时我们使用interface类型接受某些参数接口或返回类型,但输出时,比如记录日志时存在很多不方便情况,输出string发现输出的乱七八糟,因为interface在输出时并不能给你转为string,处于输出方便,总结两种方法在此,上代码:
一、interface 转json再转string
func main() { //sendGetRequestWithParams() json := JSONData{} stri := json.NewJSONData() fmt.Println("开始学习 " + stri) } func (*JSONData) NewJSONData() string { json := &JSONData{ Code: 200, Message: "OK", Result: Result{ AppID: 1, AccessToken: "aB2XvR5wL9yOzQ8", ExpireTime: 1609459200, RefreshToken: "<PASSWORD>", }, } return interfaceTOString(json) } func interfaceTOString(v interface{}) string { jsonData, err := json.Marshal(v) if err != nil { fmt.Println("Error:", err) return "" } jsonString := string(jsonData) return jsonString } type JSONData struct { Code int `json:"code"` Message string `json:"message"` Result Result `json:"result"` } type Result struct { AppID int `json:"appId"` AccessToken string `json:"accessToken"` ExpireTime int `json:"expireTime"` RefreshToken string `json:"refreshToken"` }
输出:
[Running] go run "/Users/matchen/Learn/main/main.go"
开始学习 {"code":200,"message":"OK","result":{"appId":1,"accessToken":"aB2XvR5wL9yOzQ8","expireTime":1609459200,"refreshToken":"\u003cPASSWORD\u003e"}}
注意 :\u003c和\u003e是Unicode编码的表示方式。在字符串中,它们代表<和>字符。该方法存对特殊字符会有符号需要单独转译,不一定能通用所有,下面第二种则不会
二、使用类型判断
下面是自己对类型做的一套较为全面的判断代码,可以验证各种基本类型,如有不足欢迎补充
func main() { //sendGetRequestWithParams() //json := JSONData{} //stri := json.NewJSONData() json2 := &JSONData{ Code: 200, Message: "OK", Result: Result{ AppID: 1, AccessToken: "aB2XvR5wL9yOzQ8", ExpireTime: 1609459200, RefreshToken: "<PASSWORD>", }, } stri2 := convertToString(json2) fmt.Println("开始学习 " + stri2) } type JSONData struct { Code int `json:"code"` Message string `json:"message"` Result Result `json:"result"` } type Result struct { AppID int `json:"appId"` AccessToken string `json:"accessToken"` ExpireTime int `json:"expireTime"` RefreshToken string `json:"refreshToken"` } func convertToString(data interface{}) string { value := reflect.ValueOf(data) fmt.Printf("%+v\n", value.Kind()) switch value.Kind() { case reflect.String: return value.String() case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return fmt.Sprintf("%d", value.Int()) case reflect.Float32, reflect.Float64: return fmt.Sprintf("%f", value.Float()) case reflect.Ptr: str := "" // 如果是指针则获取其指向的元素 elem := value.Elem() // 判断指向的元素是否为结构体类型 if elem.Kind() == reflect.Struct { // 使用反射获取结构体字段名称和对应的值进行拼接 for i := 0; i < elem.NumField(); i++ { field := elem.Type().Field(i) fieldValue := elem.Field(i) str += fmt.Sprintf("%s: %v, ", field.Name, convertToString(fieldValue.Interface())) } // 去除拼接结果的最后一个逗号和空格 if len(str) > 2 { str = str[:len(str)-2] } } return str case reflect.Struct: //如果是结构体 str := "" for i := 0; i < value.NumField(); i++ { field := value.Type().Field(i) fieldValue := value.Field(i) str += fmt.Sprintf("%s: %v, ", field.Name, convertToString(fieldValue.Interface())) } if len(str) > 2 { str = str[:len(str)-2] } return str case reflect.Slice: //如果是切片 str := "" for i := 0; i < value.Len(); i++ { elemValue := value.Index(i) str += fmt.Sprintf("%v, ", convertToString(elemValue.Interface())) } if len(str) > 2 { str = str[:len(str)-2] } return str case reflect.Array: str := "[" for i := 0; i < value.Len(); i++ { elemStr := convertToString(value.Index(i).Interface()) str += fmt.Sprintf("%s, ", elemStr) } if len(str) > 1 { str = str[:len(str)-2] } str += "]" return str case reflect.Map: //如果是map str := "{" keys := value.MapKeys() for i := 0; i < len(keys); i++ { key := keys[i] keyStr := convertToString(key.Interface()) valueStr := convertToString(value.MapIndex(key).Interface()) str += fmt.Sprintf("%s: %s, ", keyStr, valueStr) } if len(str) > 1 { str = str[:len(str)-2] } str += "}" return str default: return fmt.Sprintf("%v", value.Interface()) } }
输出:
开始学习 Code: 200, Message: OK, Result: AppID: 1, AccessToken: aB2XvR5wL9yOzQ8, ExpireTime: 1609459200, RefreshToken: <PASSWORD>
总结
到此这篇关于Golang中interface转string输出打印的文章就介绍到这了,更多相关interface转string输出打印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
GoLang jwt无感刷新与SSO单点登录限制解除方法详解
这篇文章主要介绍了GoLang jwt无感刷新与SSO单点登录限制解除方法,JWT是一个签名的JSON对象,通常用作Oauth2的Bearer token,JWT包括三个用.分割的部分。本文将利用JWT进行认证和加密,感兴趣的可以了解一下2023-03-03
最新评论