当前位置: 首页 > 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
}

http://www.lryc.cn/news/307175.html

相关文章:

  • 【Git教程】(三)提交详解 —— add、commit、status、stach命令的说明,提交散列值与历史,多次提交及忽略 ~
  • vue3个人网站电子宠物
  • 2.22 作业
  • office word保存pdf高质量设置
  • 微服务设计模式
  • 10.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏发送数据的操作
  • 将SU模型导入ARCGIS,并获取高度信息,多面体转SHP文件(ARCMAP)
  • 【电子通识】为什么单片机芯片上会有多组VDD电源?
  • 跟我学C++中级篇——单实例和静态化
  • 下载 axios.js 文件到本地【linux】
  • 一些matlab的常用用法。在MATLAB中,如何实现数据的导入和导出?
  • 数学建模【插值与拟合】
  • 汽修专用产品---选型介绍 汽修示波器 汽车示波器 汽车电子 汽修波形 汽车传感器波形 汽车检测
  • 如何将简历项目部署到自己的域名下
  • Redisson - 实现Java的Redis分布式和可扩展解决方案
  • 如何利用EXCEL批量插入图片
  • django rest framework 学习笔记-实战商城3
  • WPF真入门教程29--MVVM常用框架之MvvmLight
  • QT-Day4
  • 代码随想录算法训练营第三天
  • 蓝桥杯刷题1
  • 前端学习---- 前端HTML基本元素的介绍
  • 力扣思路题:丑数
  • C# this关键字的作用
  • Ubuntu18.04虚拟机磁盘扩容-lvm
  • 低代码开发:数字赋能智能制造的未来
  • janus-gateway的videoroom插件的RTP包录制功能源码详解
  • nginx+keepalived实现nginx高可用集群以及nginx实现Gateway网关服务集群
  • 主键、外键、建表范式、MySQL索引、用户管理
  • 探究前端路由hash和history的实现原理(包教包会)