Golang中interface轉(zhuǎn)string輸出打印方法
前言
在開(kāi)發(fā)過(guò)程中,有時(shí)我們使用interface類型接受某些參數(shù)接口或返回類型,但輸出時(shí),比如記錄日志時(shí)存在很多不方便情況,輸出string發(fā)現(xiàn)輸出的亂七八糟,因?yàn)閕nterface在輸出時(shí)并不能給你轉(zhuǎn)為string,處于輸出方便,總結(jié)兩種方法在此,上代碼:
一、interface 轉(zhuǎn)json再轉(zhuǎn)string
func main() {
//sendGetRequestWithParams()
json := JSONData{}
stri := json.NewJSONData()
fmt.Println("開(kāi)始學(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"
開(kāi)始學(xué)習(xí) {"code":200,"message":"OK","result":{"appId":1,"accessToken":"aB2XvR5wL9yOzQ8","expireTime":1609459200,"refreshToken":"\u003cPASSWORD\u003e"}}
注意 :\u003c和\u003e是Unicode編碼的表示方式。在字符串中,它們代表<和>字符。該方法存對(duì)特殊字符會(huì)有符號(hào)需要單獨(dú)轉(zhuǎn)譯,不一定能通用所有,下面第二種則不會(huì)
二、使用類型判斷
下面是自己對(duì)類型做的一套較為全面的判斷代碼,可以驗(yà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("開(kāi)始學(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)體字段名稱和對(duì)應(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é)果的最后一個(gè)逗號(hào)和空格
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())
}
}
輸出:
開(kāi)始學(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解golang 模板(template)的常用基本語(yǔ)法
這篇文章主要介紹了詳解golang 模板(template)的常用基本語(yǔ)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
這些關(guān)于Go中interface{}的注意事項(xiàng)你都了解嗎
這篇文章主要為大家詳細(xì)介紹了學(xué)習(xí)Go語(yǔ)言時(shí)需要了解的interface{}注意事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-03-03
Go語(yǔ)言實(shí)現(xiàn)廣播式并發(fā)聊天服務(wù)器
本文主要介紹了Go語(yǔ)言實(shí)現(xiàn)廣播式并發(fā)聊天服務(wù)器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
Go語(yǔ)言使用模板渲染HTML頁(yè)面的實(shí)現(xiàn)技巧
在Web開(kāi)發(fā)中,服務(wù)器端模板渲染仍然是很多場(chǎng)景(后臺(tái)管理、郵件模板、服務(wù)端渲染頁(yè)面等)的首選,Go標(biāo)準(zhǔn)庫(kù)里的html/template不僅易用,而且默認(rèn)防XSS,非常適合服務(wù)端渲染,本文通過(guò)實(shí)戰(zhàn)示例講解如何在Go中使用模板渲染HTML頁(yè)面,需要的朋友可以參考下2025-08-08
go-micro使用Consul做服務(wù)發(fā)現(xiàn)的方法和原理解析
這篇文章主要介紹了go-micro使用Consul做服務(wù)發(fā)現(xiàn)的方法和原理,這里提供一個(gè)通過(guò)docker快速安裝Consul的方式,當(dāng)然前提是你得安裝了docker,需要的朋友可以參考下2022-04-04

