Golang中interface轉(zhuǎn)string輸出打印方法
前言
在開發(fā)過程中,有時我們使用interface類型接受某些參數(shù)接口或返回類型,但輸出時,比如記錄日志時存在很多不方便情況,輸出string發(fā)現(xiàn)輸出的亂七八糟,因為interface在輸出時并不能給你轉(zhuǎn)為string,處于輸出方便,總結(jié)兩種方法在此,上代碼:
一、interface 轉(zhuǎn)json再轉(zhuǎn)string
func main() { //sendGetRequestWithParams() json := JSONData{} stri := json.NewJSONData() fmt.Println("開始學(xué)習(xí) " + 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"
開始學(xué)習(xí) {"code":200,"message":"OK","result":{"appId":1,"accessToken":"aB2XvR5wL9yOzQ8","expireTime":1609459200,"refreshToken":"\u003cPASSWORD\u003e"}}
注意 :\u003c和\u003e是Unicode編碼的表示方式。在字符串中,它們代表<和>字符。該方法存對特殊字符會有符號需要單獨轉(zhuǎn)譯,不一定能通用所有,下面第二種則不會
二、使用類型判斷
下面是自己對類型做的一套較為全面的判斷代碼,可以驗證各種基本類型,如有不足歡迎補(bǔ)充
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("開始學(xué)習(xí) " + 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() // 判斷指向的元素是否為結(jié)構(gòu)體類型 if elem.Kind() == reflect.Struct { // 使用反射獲取結(jié)構(gòu)體字段名稱和對應(yīng)的值進(jìn)行拼接 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())) } // 去除拼接結(jié)果的最后一個逗號和空格 if len(str) > 2 { str = str[:len(str)-2] } } return str case reflect.Struct: //如果是結(jié)構(gòu)體 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()) } }
輸出:
開始學(xué)習(xí) Code: 200, Message: OK, Result: AppID: 1, AccessToken: aB2XvR5wL9yOzQ8, ExpireTime: 1609459200, RefreshToken: <PASSWORD>
總結(jié)
到此這篇關(guān)于Golang中interface轉(zhuǎn)string輸出打印的文章就介紹到這了,更多相關(guān)interface轉(zhuǎn)string輸出打印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡單高效!Go語言封裝二級認(rèn)證功能實現(xiàn)
本文將介紹如何使用Go語言封裝二級認(rèn)證功能,實現(xiàn)簡單高效的用戶認(rèn)證流程,二級認(rèn)證是一種安全措施,要求用戶在登錄后進(jìn)行額外的身份驗證,以提高賬戶安全性,2023-10-10Go實現(xiàn)后臺任務(wù)調(diào)度系統(tǒng)的實例代碼
平常我們在開發(fā)API的時候,前端傳遞過來的大批數(shù)據(jù)需要經(jīng)過后端處理,如果后端處理的速度快,前端響應(yīng)就快,反之則很慢,影響用戶體驗,為了解決這一問題,需要我們自己實現(xiàn)后臺任務(wù)調(diào)度系統(tǒng),本文將介紹如何用Go語言實現(xiàn)后臺任務(wù)調(diào)度系統(tǒng),需要的朋友可以參考下2023-06-06