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

go interface{} 和string的转换问题

 1.遇到的问题

问题来源于,我sql模版拼接遇到的问题。

 首先,这样是没有问题的。

	var qhx interface{} = "qhx"s := qhx.(string)fmt.Println(s)

但是当我在这段代码里用:1.类型断言

var sqlStr = "select * from `tx_user` where username = '%s'"
jointSqlStr1(sqlStr, "admin")func jointSqlStr1(sqlStr string,args ...interface{}) string {for _,arg := range args {sqlStr = fmt.Sprintf(arg.(string)) // 类型断言}return sqlStr
}

他就会报interface{} not string这个问题 

后面我试了试,就算用 2. switch - type,也会类型匹配不到。

解放方案:

先通过 3.fmt.Spinft()函数转换为字符串,会多了 [ ]这个东西,再切除就可以了。

func jointSqlStr(sqlStr string, args ...interface{}) string {for _, arg := range args {str := fmt.Sprintf("%s", arg) // [admin]str = str[1 : len(str)-1] // adminsqlStr = fmt.Sprintf(sqlStr, str)}return sqlStr
}

后来发现: 以上都是正确的方法。

2.我的问题

我的问题在函数嵌套。怎么讲呢?

// 执行select all
func ExecuteSelectAll(stc interface{}, sql string, params ...interface{}) {sql = jointSqlStr(sql, params) // 我拿到params,直接传入joinSqlStr里面err := Db.Select(stc, sql)if err != nil {util.Log.Error("Sql Select Error:" + err.Error())return}
}func jointSqlStr(sqlStr string, args ...interface{}) string {for _, arg := range args {str := fmt.Sprintf("%s", arg) // [admin]str = str[1 : len(str)-1]     // adminsqlStr = fmt.Sprintf(sqlStr, str)}return sqlStr
}

导致拿到的类型结构是这样似的。显然这是不对的。

正确的写法,应该这样:

func ExecuteSelectAll(stc interface{}, sql string, params ...interface{}) {sql = jointSqlStr(sql, params...)// ....
}
但是,如下图: 经过Sprintf()拼接之后,如果有空余的%s没被填充,最后出现下面这种状况。
var sqlStr = "select * from tx_user WHERE username= '%s' and password = '%s'"
fmt.Sprintf(sqlStr,"admin")

因此,代码要这样改。 

func jointSqlStr(sqlStr string, args ...interface{}) string {// 以%s分割strs := strings.Split(sqlStr, "%s")if len(strs) == 0 {return sqlStr}newSql := ""for i, _ := range strs {newSql += strs[i]if i != len(strs)-1 {switch args[i].(type) {case string:newSql += args[i].(string)breakcase int:newSql += fmt.Sprintf("%v", args[i].(int))breakcase uint:newSql += fmt.Sprintf("%v", args[i].(uint))break}}}return newSql
}

相关文章:

go interface{} 和string的转换问题

1.遇到的问题 问题来源于,我sql模版拼接遇到的问题。 首先,这样是没有问题的。 var qhx interface{} "qhx"s : qhx.(string)fmt.Println(s) 但是当我在这段代码里用:1.类型断言 var sqlStr "select * from tx_user where username %s" join…...

【Git教程】(三)提交详解 —— add、commit、status、stach命令的说明,提交散列值与历史,多次提交及忽略 ~

Git教程 提交详解 1️⃣ 访问权限与时间戳2️⃣ add命令与 commit 命令3️⃣ 提交散列值4️⃣ 提交历史5️⃣ 一种特别的提交查看方法6️⃣ 同一项目的多部不同历史6.1 部分输出:-n6.2 格式化输出:--format、--oneline6.3 统计修改信息:--st…...

vue3个人网站电子宠物

预览 具体代码 Attack.gif Attacked.gif Static.gif Walk.gif Attack.gif Static.gif Attacked.gif Walk.gif <template><div class"pet-container" ref"petContainer"><p class"pet-msg">{{ pet.msg }}</p><img re…...

2.22 作业

顺序表 运行结果 fun.c #include "fun.h" seq_p create_seq_list() {seq_p L (seq_p)malloc(sizeof(seq_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->len 0; bzero(L,sizeof(L->data)); return L; } int seq_empty(seq_p L) {i…...

office word保存pdf高质量设置

1 采用第三方pdf功能生成 分辨率越大质量越好...

微服务设计模式

微服务在过去十年中已经发展到现在非常成熟的水平。许多模式被演变以适应不同的需求。 架构模式 分层图案 2层三层n层客户端服务器 一个服务器和多个客户端大多数在线应用程序,例如电子邮件、银行应用程序等。分开演示 模型-视图-控制器 (MVC) 模型——包含核心功能和数据查看…...

10.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏发送数据的操作

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;接管游戏连接服务器的操作 码云地址&#xff08;master 分支&#xff09;&#xff1a;染指/titan 码云版本号&#xff1a;00820853d5492fa7b6e32407d46b5f9c01930ec6 代码下载地址&#xff0c;在 ti…...

将SU模型导入ARCGIS,并获取高度信息,多面体转SHP文件(ARCMAP)

问题:将Sketchup中导出的su模型,导入arcgis并得到面shp文件,进而获取各建筑的高度、面积等信息。 思路: (1)导入arcgis得到多面体 (2)转为面shp文件 (3)计算高度/面积等 1、【3D Analyst工具】【转换】【由文件转出】【导入3D文件】(在此步骤之间,建议先建立一个…...

【电子通识】为什么单片机芯片上会有多组VDD电源?

在单片机芯片规格书中&#xff0c;我们经常能看到多个组VDD的设计&#xff0c;如下红框所示管脚都是VDD管脚。 为什么需要这样设计&#xff1f;只设置一个VDD管脚&#xff0c;把其他的VDD管脚让出来多做几个IO或是其他复用功能不好吗&#xff1f;接下来我们从单片机内部的电路结…...

跟我学C++中级篇——单实例和静态化

一、单实例模式 在设计模式中&#xff0c;单实例模式几乎是所有语言中都非常常用的一种设计模式。它在实际的应用中也非常广泛&#xff0c;在很多的开源框架中&#xff0c;都可以看到单实例的影子。单实例&#xff0c;简单的就可以看做在整个应用周期中&#xff0c;只有一个对…...

下载 axios.js 文件到本地【linux】

方式一 npm install axios在$NODE_PATH/node_modules/axios/dist路径下即可找到axios.js。 方式二 1、百度搜索 GitHub 官网&#xff1a;https://github.com/ 2、搜索 axios 3、点击 axios/axios 4、下载到本地 5、解压&#xff0c;进入到 dist 文件夹** 参考&#x…...

一些matlab的常用用法。在MATLAB中,如何实现数据的导入和导出?

一些matlab的常用用法。 MATLAB&#xff08;Matrix Laboratory&#xff09;是一款广泛使用的数值计算环境和编程语言&#xff0c;主要用于算法开发、数据可视化、数据分析以及数值计算等。以下是一些MATLAB的常用用法&#xff1a; 创建矩阵&#xff1a; 使用方括号 [] 创建矩阵…...

数学建模【插值与拟合】

一、插值与拟合简介 在数学建模过程中&#xff0c;通常要处理由试验、测量得到的大量数据或一些过于复杂而不便于计算的函数表达式&#xff0c;针对此情况&#xff0c;很自然的想法就是&#xff0c;构造一个简单的函数作为要考察数据或复杂函数的近似。插值和拟合就可以解决这…...

汽修专用产品---选型介绍 汽修示波器 汽车示波器 汽车电子 汽修波形 汽车传感器波形 汽车检测

为了满足汽车电子用户的测量需求&#xff0c;我司特推出汽修专用版示波器&#xff0c;一键测量&#xff0c;轻松找出汽车问题。 LOTO各种型号的示波器其实都可以用作汽车传感器信号波形的检测。汽修应用中&#xff0c;工程师对示波器的性能要求对于LOTO产品来说不算高。 在我们…...

如何将简历项目部署到自己的域名下

通过上一篇文章我们得知如何在Github上Fork项目到自己账号下&#xff0c;还有学会配置好简历项目并部署上线&#xff0c;接下来我们就来看一下该项目是如何部署到自己的域名下的 &#x1f447; 在项目文档中可以看到该简历项目是部署在Vercel上的&#xff0c;首先打开Vercel的官…...

Redisson - 实现Java的Redis分布式和可扩展解决方案

Redisson - 实现Java的Redis分布式和可扩展解决方案 引言&#xff1a; 在现代的分布式系统中&#xff0c;缓存和数据存储扮演着至关重要的角色。Redis作为一种高性能的键值存储数据库&#xff0c;被广泛用于缓存、消息队列、实时数据分析等场景。然而&#xff0c;原生的Redis…...

如何利用EXCEL批量插入图片

目录 1.excel打开目标表格&#xff1b; 2.点开视图-宏-录制宏&#xff0c;可以改宏的名字或者选择默认&#xff1b; 3.然后点开视图-宏-查看宏 4.点编辑进去 5.修改代码&#xff1a; &#xff08;1&#xff09;打开之后会显示有一堆代码 &#xff08;2&#xff09;将这个…...

django rest framework 学习笔记-实战商城3

01用户模块模型定义_哔哩哔哩_bilibili 本博客借鉴至大佬的视频学习笔记 用户模块及商品数据表结构设计 from ckeditor.fields import RichTextField # pip install django-ckeditor from django.db import models# Create your models here. # from wx.richtext import Ri…...

WPF真入门教程29--MVVM常用框架之MvvmLight

1、MVVM模式回顾 关于mvvm模式的基础知识&#xff0c;请看这2个文章&#xff1a; WPF真入门教程23--MVVM简单介绍 WPF真入门教程24--MVVM模式Command命令 做过VUE开发或微信小程序开发的伙伴&#xff0c;就知道MVVM模式&#xff0c;核心就是数据驱动控件&#xff0c;全栈开…...

QT-Day4

思维导图 作业&#xff1a; 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMessageBox> #include <QTimerEvent>//定时器事件类 #include <QTime> #include <QDebug> #include <QPushButton> #include <QT…...

Klipper固件终极指南:高效解决3D打印精度与速度的核心挑战

Klipper固件终极指南&#xff1a;高效解决3D打印精度与速度的核心挑战 【免费下载链接】klipper Klipper is a 3d-printer firmware 项目地址: https://gitcode.com/GitHub_Trending/kl/klipper Klipper固件是一款革命性的3D打印机固件解决方案&#xff0c;通过创新的分…...

DDrawCompat:让经典DirectX游戏在现代Windows系统上重获新生

DDrawCompat&#xff1a;让经典DirectX游戏在现代Windows系统上重获新生 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/…...

保姆级教程:用Termux在安卓手机上装Kali Linux(附VNC桌面配置与常见网络问题解决)

安卓手机零基础部署Kali Linux实战指南&#xff1a;从Termux配置到VNC远程桌面 在移动互联网时代&#xff0c;安全研究人员和开发者常常需要在不同场景下快速搭建渗透测试环境。本文将手把手教你如何在不Root安卓设备的情况下&#xff0c;通过Termux终端模拟器完整部署Kali Lin…...

3大核心优势解析:为什么DeepMosaics是智能马赛克处理的最佳选择?

3大核心优势解析&#xff1a;为什么DeepMosaics是智能马赛克处理的最佳选择&#xff1f; 【免费下载链接】DeepMosaics Automatically remove the mosaics in images and videos, or add mosaics to them. 项目地址: https://gitcode.com/gh_mirrors/de/DeepMosaics 在数…...

告别盲人摸象:用Python脚本模拟Tester,手把手带你玩转UDS诊断(ISO 14229)

告别盲人摸象&#xff1a;用Python脚本模拟Tester&#xff0c;手把手带你玩转UDS诊断&#xff08;ISO 14229&#xff09; 在汽车电子开发与测试领域&#xff0c;UDS&#xff08;Unified Diagnostic Services&#xff09;协议作为ISO 14229标准的核心&#xff0c;已成为ECU诊断的…...

别再乱叠层了!四层、六层、八层PCB板分层实战指南(附Altium Designer设置要点)

多层PCB设计实战&#xff1a;从四层到八层的叠层策略与Altium Designer实现 在高速数字电路和射频系统设计中&#xff0c;PCB叠层结构的选择直接影响信号完整性、电源分配和电磁兼容性。许多工程师在面对四层、六层和八层板设计时&#xff0c;常常陷入"层数越多越好"…...

Phi-3.5-mini-instruct JDK1.8环境配置与Java项目迁移指南

Phi-3.5-mini-instruct JDK1.8环境配置与Java项目迁移指南 1. 为什么JDK1.8仍然重要 尽管Java已经发布了多个新版本&#xff0c;但JDK1.8在企业环境中仍然占据重要地位。许多大型系统、金融应用和政府项目都基于这个长期支持版本构建。它的稳定性、成熟度和广泛兼容性使其成为…...

nRF52832低功耗设计实战:用GPIOTE的PORT事件实现超低功耗按键检测(附代码)

nRF52832低功耗设计实战&#xff1a;用GPIOTE的PORT事件实现超低功耗按键检测 在电池供电的物联网设备中&#xff0c;按键检测的功耗优化常常成为工程师的痛点。传统轮询方式会阻止CPU进入深度休眠&#xff0c;而普通中断方案又依赖高频时钟导致功耗居高不下。nRF52832的GPIOTE…...

技术分享 | 接口自动化的高复用测试方案

一 探索新测试方案的初衷 我们对近期有信创或上云改造计划的多个系统进行调研分析&#xff0c;发现相关系统具有接口参数多、关联条件复杂、请求返回格式不统一的共同特点&#xff0c;在尝试使用常规自动化测试方案建设时&#xff0c;发现了以下急需攻克的难关&#xff1a; 1…...

别再只用JTAG下载程序了!手把手教你用边界扫描给BGA芯片做‘体检’

硬件工程师的BGA检测秘籍&#xff1a;边界扫描实战指南 当一块搭载BGA封装芯片的电路板从产线下来&#xff0c;如何快速判断数百个焊点是否存在虚焊、短路&#xff1f;传统方法可能需要X光检测或破坏性测试&#xff0c;而边界扫描技术提供了一种非侵入式、高效率的解决方案。本…...