当前位置: 首页 > news >正文

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>

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

相关文章:

interface转string输出打印

文章目录 前言一、interface 转json再转string二、使用类型判断 前言 在开发过程中&#xff0c;有时我们使用interface类型接受某些参数接口或返回类型&#xff0c;但输出时&#xff0c;比如记录日志时存在很多不方便情况&#xff0c;输出string发现输出的乱七八糟&#xff0c…...

如何在PS5上使用金手指修改游戏

环境&#xff1a;windows PS5 问题&#xff1a;PS5 没有GodHen&#xff0c;无法使用json金手指&#xff0c;PKG金手指比较少 解决办法&#xff1a;使用MultiTrainerv从网络注入PS5&#xff0c;修改进程内存 背景&#xff1a;为了护肝&#xff0c;拒绝刷刷刷 解决过程&#xff…...

M1芯片MAC 安装MySQL、Nacos遇到的问题

摘要&#xff1a;由于电脑上是M1芯片&#xff0c;安装软件时遇到一系列问题&#xff0c;记录下踩的坑&#xff01;&#xff01;&#xff01; 安装MySQL MySQl官网下载链接区分ARM和X86架构&#xff0c;终端输入uname -a指令&#xff0c;本机显示为ARM czhczhdeiMac ~ % uname…...

尝试创建若依系统项目(vue3+element-plus+vite) 持续更新...

若依官网&#xff1a;RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架|RuoYi开源|RuoYi视频|若依视频|RuoYi开发文档|若依开发文档|Java开源框架|Java|Spri…...

Pytest测试用例参数化

pytest.mark.parametrize(参数名1,参数名2...参数n, [(参数名1_data1,参数名2_data1...参数名n_data1),(参数名1_data2,参数名2_data2...参数名n_data2)]) 场景&#xff1a; 定义一个登录函数test_login,传入参数为name,password&#xff0c;需要用多个账号去测试登录功能 # …...

【Vue】指令之显示切换,属性绑定

Vue指令【2】 显示切换与属性绑定v-show指令v-if指令v-bind指令 显示切换与属性绑定 v-show指令 作用&#xff1a;根据真假切换元素的显示状态 指令后的内容最终都会解析为布尔值数据改变之后&#xff0c;对应元素的显示状态会同步更新 语法&#xff1a; <div id"…...

Z字型遍历二叉树

编码过程 掏出Deque&#xff0c;先写从左往右遍历 class Solution {public List<List<Integer>> zigzagLevelOrder(TreeNode root) {Deque<TreeNode> deque new ArrayDeque<>();deque.offer(root);while (!deque.isEmpty()) {int n deque.size();f…...

【Go语言成长之路】安装Go

文章目录 安装Go一、下载Go语言安装包二、删除以前安装的Go版本三、添加/usr/local/go/bin到环境变量内四、确认安装成功 安装Go Note: 这里只演示安装Linux版本的Go&#xff0c;若为其它版本&#xff0c;请按照官网的安装教程进行安装即可。 一、下载Go语言安装包 ​ 在浏览…...

C语言常见面试题:C语言中如何进行图形界面编程?

在C语言中进行图形界面编程通常需要借助一些图形库。以下是一些常用的C语言图形库及其使用方法&#xff1a; GTK (GIMP Toolkit)&#xff1a; GTK 是一个广泛使用的开源图形库&#xff0c;可用于创建跨平台的桌面应用程序。它提供了一套丰富的控件&#xff0c;如按钮、文本框、…...

删除元素(数组)

题目描述 输入一个递增有序的整型数组A有n个元素&#xff0c;删除下标为i的元素&#xff0c;使其仍保持连续有序。注意&#xff0c;有效下标从0开始。 定义如下两个函数分别实现删除元素操作和数组输出操作。 void del(int a[], int n, int i); /*删除数组a中下标为i的元素*…...

WPF DataTemplate内重写BorderBrush,VisualBrush内数据源绑定提示绑定失败

定义DataTemplate 数据模板文件&#xff0c;内容如下 <DataTemplate x:Key"{DataTemplateKey {x:Type VM:TemplateListVM}}" DataType"{x:Type VM:TemplateListVM}"> <Grid Margin"0" Grid.Row"3" Height"50" Ver…...

ElasticSearch搜索与分析引擎-Linux离线环境安装教程

目录 一、下载安装包 网盘链接: 二、安装流程及遇到的问题和解决方案 &#xff08;1&#xff09;JDK安装 &#xff08;2&#xff09;Elasticsearch安装 &#xff08;3&#xff09;Kibana安装 ​&#xff08;4&#xff09;Ik分词器安装 三、启动过程中的问题 &#xff…...

网络安全全栈培训笔记(59-服务攻防-中间件安全CVE复现lSApacheTomcataNginx)

第59天 服务攻防-中间件安全&CVE复现&lS&Apache&Tomcata&Nginx 知识点&#xff1a; 中间件及框架列表&#xff1a; lIS,Apache,Nginx,Tomcat,Docker,Weblogic,JBoos,WebSphere,Jenkins, GlassFish,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Sprng,Flask,…...

操作系统真象还原---系列笔记总结

闲话 最开始知道这本书是在校内论坛上&#xff0c;有同学通过这本书里的项目拿到大厂的ssp offer&#xff0c;于是就从网上订购了这本较为大部头的书&#xff0c;想要在简历上添加一个足够底层并且有意思的项目经历&#xff0c;从而帮助自己在秋招时赢得一个好的offer。 第一遍…...

猫用空气净化器好吗?好用的养猫宠物空气净化器品牌推荐

作为一个养猫五年的资深铲屎官&#xff0c;我对如何轻松快乐地养猫有一些心得。猫咪每天在家里奔跑&#xff0c;导致家里经常会出现“猫毛雪”&#xff0c;沙发、地板和衣服都成了重灾区。在除猫毛的问题上&#xff0c;我真的尝试了各种方法&#xff0c;几乎用上了所有的技能。…...

【计网·湖科大·思科】实验六 IP数据报的发送和转发流程、默认路由和特定主机路由

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…...

freertos 源码分析一 list链表数据结构

链表和任务管理是freertos 的核心&#xff0c;先分析链表源码&#xff0c;freertos的链表是双向环形链表&#xff0c;定义与数据结构在list.h中&#xff0c;表项的初始化&#xff0c;插入与删除在list.c中。 数据结构 一、表项数据结构 struct xLIST_ITEM {listFIRST_LIST_IT…...

小程序uni-swiper-action-item滑动不了

<uni-swipe-action><uni-swipe-action-item :options"options"></uni-swipe-action-item></uni-swipe-action> 要在options前面加上right或left <uni-swipe-action><uni-swipe-action-item :right-options"options">&…...

【新课】安装部署系列Ⅲ—Oracle 19c Data Guard部署之两节点RAC部署实战

本课程由云贝教育-刘峰老师出品&#xff0c;感谢关注 课程介绍 Oracle Real Application Clusters (RAC) 是一种跨多个节点分布数据库的企业级解决方案。它使组织能够通过实现容错和负载平衡来提高可用性和可扩展性&#xff0c;同时提高性能。本课程基于当前主流版本Oracle 1…...

【从零开始的rust web开发之路 四】rust语言tokio异步使用redis教程

文章目录 前言一、首先引入依赖二、创建redis客户端三、相关操作设置值mset设置多个key值设置含有过期时间的值如果key不存在才设置获取基本类型值删除一个键删除多个键判断键是否存在 如何使用json序列化导入相关依赖代码相关实例 总结 前言 使用rust写web&#xff0c;自然是…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...