interface转string输出打印

文章目录

  • 前言
  • 一、interface 转json再转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 strcase 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 strcase 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 strcase 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 strcase reflect.Map://如果是mapstr := "{"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 strdefault:return fmt.Sprintf("%v", value.Interface())}
}

输出:

开始学习 Code: 200, Message: OK, Result: AppID: 1, AccessToken: aB2XvR5wL9yOzQ8, ExpireTime: 1609459200, RefreshToken: <PASSWORD>

如有不足,欢迎多多补充,希望对大家有帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例九:寻找丢失的数据

在生活中我们经常会遇到误将重要的数据文件删除或误格式化U盘,今天小编带大家一块来学习将丢失的数据找回,来,首先我们这节案例要使用一个工具(R-Studio) 接下来我们一块来如何将数据恢复; 由于我们软件是英文,我们首先要将切换为中文的;‍

记一次 Android CPU高使用率排查

文章目录 背景排查高占用的进程adb shelltoptop -b -H -n 1 | grep 29337 (打印各线程 cpu使用详情)kill -3 29337 (生成trace文件)adb pull /data/anr /Users/gerry.liang/Desktop定位问题 补充说明: 背景 测试同学反馈我们的App CPU使用率 90% 居高不下,经过一番艰难的排查后…

Facebook的数字合作愿景:创新与未来发展

随着科技的飞速发展&#xff0c;Facebook一直处于数字创新的前沿&#xff0c;致力于构建开放、智能、社交的数字社交体验。本文将深入探讨Facebook的数字合作愿景&#xff0c;探索其在创新与未来发展方面的雄心壮志。 引言 在当今数字化时代&#xff0c;社交媒体不仅是人们沟通…

多线程(进阶三:JUC)

目录 一、Callable接口 1、创建线程的操作 2、编写多线程代码 &#xff08;1&#xff09;实现Runnable接口&#xff08;使用匿名内部类&#xff09; &#xff08;2&#xff09;实现Callable接口&#xff08;使用匿名内部类&#xff09; 二、ReentrantLock 1、ReentrantL…

Docker 容器卷

1、概念介绍 如果是CentOS7安全模块会比之前系统版本加强&#xff0c;不安全的会先禁止&#xff0c;所以目录挂载的情况被默认为不安全的行为&#xff0c;在SELinux里面挂载目录被禁止掉了&#xff0c;如果要开启&#xff0c;我们一般使用--privlegedtrue命令&#xff0c;扩大…

微信小程序新手入门教程三:基础语法介绍

WXML&#xff08;WeiXin Markup Language&#xff09;是框架设计的一套标签语言&#xff0c;可以与各种组件相结合&#xff0c;进行页面构建。 一 常用标签 wxml的语法结构与我们熟悉的html很像&#xff0c;但在细节处略有不同&#xff0c;我们可以参考html标签对比记忆。wxm…

面试150 位1的个数 位运算

Problem: 191. 位1的个数 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考 复杂度 Code public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n){int res 0;while (n ! 0){res 1;n & n - 1;// 把最后…

python-游戏篇-初级-飞机大战

文章目录 开发环境要求运行方法代码效果 开发环境要求 本系统的软件开发及运行环境具体如下。 操作系统&#xff1a;Windows 7、Windows 10。Python版本&#xff1a;Python 3.7.1。开发工具&#xff1a;PyCharm 2018或VScode。Python内置模块&#xff1a;sys、random、codecs…

聊聊百度造车

10月27日&#xff0c;极越-01上市&#xff0c;一个月后大幅降价&#xff0c;时至今日距离发布已经过去了两个月&#xff0c;官方迟迟不肯公布销量&#xff0c;实际情况大家也都心知肚明。 如今小米汽车技术发布会风头无两&#xff0c;而同一年宣布造车的极越却无人问津&#x…

Hadoop:HDFS学习巩固——基础习题及编程实战

一 HDFS 选择题 1.对HDFS通信协议的理解错误的是&#xff1f; A.客户端与数据节点的交互是通过RPC&#xff08;Remote Procedure Call&#xff09;来实现的 B.HDFS通信协议都是构建在IoT协议基础之上的 C.名称节点和数据节点之间则使用数据节点协议进行交互 D.客户端通过一…

leetcode 28.找出字符串中第一个匹配项的下标(python版)

需求 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。 如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入&#xff1a;haystack…

深度学习入门笔记(八)实战经验

前面几节介绍了很多理论,难免会好奇:理论如何与实战结合呢? 本节我们就穿插一点实战经验,来换换脑子~ 1. 显卡warmup 进行深度学习训练和推理时,往往第一次运行的耗时比较高,这是因为显卡需要warm-up,就是“热身”,才能发挥出显卡的性能。 关于热身,个人理解,显卡…

FS【2】:CAT-Net

文章目录 前言AbstractIntroductionMethodsProblem DefinitionNetwork OverviewMask Incorporated Feature ExtractionCross Masked Attention TransformerSelf-Attention ModuleCross Masked Attention ModulePrototypical Segmentation Module Iterative Refinement Framewor…

Unity | Spine动画记录

https://blog.csdn.net/linshuhe1/article/details/79792432 https://blog.csdn.net/winds_tide/article/details/128925407 1.需要的三个文件 通常制作好的 Spine 动画导出时会有三个文件&#xff1a; .png 、.json 和 .atlas&#xff1a; skeleton-name.json 或 skeleton-…

压力测试工具-Jmeter使用总结

目录 一.前言 二.线程组 三.线程组的组件 四.线程组-HTTP请求 1、JSON提取器 2、XPATH提取器 3、正则表达式提取器 五.线程组-断言 1、响应断言 2、JSON断言 六.创建测试 1.创建线程组 2.配置元件 3.构造HTTP请求 4.添加HTTP请求头 5.添加断言 6.添加查看结果树…

算法练习03——滑动窗口

目录 3. 无重复字符的最长子串*438. 找到字符串中所有字母异位词*30. 串联所有单词的子串***(hard) 3. 无重复字符的最长子串* https://leetcode.cn/problems/longest-substring-without-repeating-characters/ class Solution {public int lengthOfLongestSubstring(String …

Mac电脑连接linux远程桌面

起因 家庭中的内网下有一台ubuntu虚拟机&#xff0c;只能通过ssh终端操作或者通过实体机进行操作实在有些不方便。所以便想着通过linux远程桌面的方式进行连接&#xff0c;由于家庭内网&#xff0c;延迟还是非常低的。 步骤 首先在ubuntu虚拟机上安装xrdp&#xff08;可能已…

Vue3下载WEBAPI导出的Excel文件

webApi查询数据保存为Excel /// <summary>/// 获取LMI3D相机涂胶测量数据/// </summary>/// <returns></returns>[HttpPost(Name "GetLMI3DGlueDataToExcel")]public async Task<IActionResult> GetLMI3DGlueDataToExcel(QueryGlueM…

利用nginx替换Docker内部程序_静态资源_实现自定义背景--nginx工作笔记008

因为有个程序是打包的Docker镜像,那么问题就来了,我想修改登录页面上的一个图片,如果 你不想再去修改程序了,那么怎么办? 你可以这样,让nginx请求某个图片的时候,自动给他重定向,访问其他的图片资源,很好用: 来看看怎么做吧: server {listen 9003;server_name localhost;loc…

基于SSM的健身房会员管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的健身房会员管理系统(有报告)。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Mybatis J…