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二、使用类型判断 前言 在开发过程中,有时我们使用interface类型接受某些参数接口或返回类型,但输出时,比如记录日志时存在很多不方便情况,输出string发现输出的乱七八糟,…...
如何在PS5上使用金手指修改游戏
环境:windows PS5 问题:PS5 没有GodHen,无法使用json金手指,PKG金手指比较少 解决办法:使用MultiTrainerv从网络注入PS5,修改进程内存 背景:为了护肝,拒绝刷刷刷 解决过程ÿ…...
M1芯片MAC 安装MySQL、Nacos遇到的问题
摘要:由于电脑上是M1芯片,安装软件时遇到一系列问题,记录下踩的坑!!! 安装MySQL MySQl官网下载链接区分ARM和X86架构,终端输入uname -a指令,本机显示为ARM czhczhdeiMac ~ % uname…...
尝试创建若依系统项目(vue3+element-plus+vite) 持续更新...
若依官网: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)]) 场景: 定义一个登录函数test_login,传入参数为name,password,需要用多个账号去测试登录功能 # …...
【Vue】指令之显示切换,属性绑定
Vue指令【2】 显示切换与属性绑定v-show指令v-if指令v-bind指令 显示切换与属性绑定 v-show指令 作用:根据真假切换元素的显示状态 指令后的内容最终都会解析为布尔值数据改变之后,对应元素的显示状态会同步更新 语法: <div id"…...
Z字型遍历二叉树
编码过程 掏出Deque,先写从左往右遍历 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,若为其它版本,请按照官网的安装教程进行安装即可。 一、下载Go语言安装包 在浏览…...
C语言常见面试题:C语言中如何进行图形界面编程?
在C语言中进行图形界面编程通常需要借助一些图形库。以下是一些常用的C语言图形库及其使用方法: GTK (GIMP Toolkit): GTK 是一个广泛使用的开源图形库,可用于创建跨平台的桌面应用程序。它提供了一套丰富的控件,如按钮、文本框、…...
删除元素(数组)
题目描述 输入一个递增有序的整型数组A有n个元素,删除下标为i的元素,使其仍保持连续有序。注意,有效下标从0开始。 定义如下两个函数分别实现删除元素操作和数组输出操作。 void del(int a[], int n, int i); /*删除数组a中下标为i的元素*…...
WPF DataTemplate内重写BorderBrush,VisualBrush内数据源绑定提示绑定失败
定义DataTemplate 数据模板文件,内容如下 <DataTemplate x:Key"{DataTemplateKey {x:Type VM:TemplateListVM}}" DataType"{x:Type VM:TemplateListVM}"> <Grid Margin"0" Grid.Row"3" Height"50" Ver…...
ElasticSearch搜索与分析引擎-Linux离线环境安装教程
目录 一、下载安装包 网盘链接: 二、安装流程及遇到的问题和解决方案 (1)JDK安装 (2)Elasticsearch安装 (3)Kibana安装 (4)Ik分词器安装 三、启动过程中的问题 ÿ…...
网络安全全栈培训笔记(59-服务攻防-中间件安全CVE复现lSApacheTomcataNginx)
第59天 服务攻防-中间件安全&CVE复现&lS&Apache&Tomcata&Nginx 知识点: 中间件及框架列表: lIS,Apache,Nginx,Tomcat,Docker,Weblogic,JBoos,WebSphere,Jenkins, GlassFish,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Sprng,Flask,…...
操作系统真象还原---系列笔记总结
闲话 最开始知道这本书是在校内论坛上,有同学通过这本书里的项目拿到大厂的ssp offer,于是就从网上订购了这本较为大部头的书,想要在简历上添加一个足够底层并且有意思的项目经历,从而帮助自己在秋招时赢得一个好的offer。 第一遍…...
猫用空气净化器好吗?好用的养猫宠物空气净化器品牌推荐
作为一个养猫五年的资深铲屎官,我对如何轻松快乐地养猫有一些心得。猫咪每天在家里奔跑,导致家里经常会出现“猫毛雪”,沙发、地板和衣服都成了重灾区。在除猫毛的问题上,我真的尝试了各种方法,几乎用上了所有的技能。…...
【计网·湖科大·思科】实验六 IP数据报的发送和转发流程、默认路由和特定主机路由
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…...
freertos 源码分析一 list链表数据结构
链表和任务管理是freertos 的核心,先分析链表源码,freertos的链表是双向环形链表,定义与数据结构在list.h中,表项的初始化,插入与删除在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部署实战
本课程由云贝教育-刘峰老师出品,感谢关注 课程介绍 Oracle Real Application Clusters (RAC) 是一种跨多个节点分布数据库的企业级解决方案。它使组织能够通过实现容错和负载平衡来提高可用性和可扩展性,同时提高性能。本课程基于当前主流版本Oracle 1…...
【从零开始的rust web开发之路 四】rust语言tokio异步使用redis教程
文章目录 前言一、首先引入依赖二、创建redis客户端三、相关操作设置值mset设置多个key值设置含有过期时间的值如果key不存在才设置获取基本类型值删除一个键删除多个键判断键是否存在 如何使用json序列化导入相关依赖代码相关实例 总结 前言 使用rust写web,自然是…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
AI书签管理工具开发全记录(十八):书签导入导出
文章目录 AI书签管理工具开发全记录(十八):书签导入导出1.前言 📝2.书签结构分析 📖3.书签示例 📑4.书签文件结构定义描述 🔣4.1. 整体文档结构4.2. 核心元素类型4.3. 层级关系4.…...
【前端实战】如何让用户回到上次阅读的位置?
目录 【前端实战】如何让用户回到上次阅读的位置? 一、总体思路 1、核心目标 2、涉及到的技术 二、实现方案详解 1、基础方法:监听滚动,记录 scrollTop(不推荐) 2、Intersection Observer 插入探针元素 3、基…...
开源 vGPU 方案:HAMi,实现细粒度 GPU 切分
本文主要分享一个开源的 GPU 虚拟化方案:HAMi,包括如何安装、配置以及使用。 相比于上一篇分享的 TimeSlicing 方案,HAMi 除了 GPU 共享之外还可以实现 GPU core、memory 得限制,保证共享同一 GPU 的各个 Pod 都能拿到足够的资源。…...
C++ 变量和基本类型
1、变量的声明和定义 1.1、变量声明规定了变量的类型和名字。定义初次之外,还申请存储空间,也可能会为变量赋一个初始值。 如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量: e…...
