go语言将单反斜杠改为双反斜杠

最近开发的时候遇到这么个问题,就是在window上获取了文件目录的字段,然后将这个绝对路径保存到数据库,最后前端需要请求的时候,就需要读取数据库存的文件目录路径给前端,前端要进行展示。但是前端展示的时候路径的双反斜杠变成了单反斜杠,然后问题来了,对于这个路径我们有模糊查询的功能,导致含有单反斜杠的模糊查询无法正常查询。

经过查询多方资料和测试,发现反斜杠是属于转义字符,我查看数据库和返回给前端的数据,里面的数据都是有两个反斜杠的,但是前端显示出来就只有一个,这个是属于正常的,因为是字符串,两个反斜杠,其中一个被认为是转义字符,另一个被认为是字符串,所以只显示一个反斜杠,但是关键字查询的时候,用户肯定是直接复制显示的单个反斜杠的字符串,所以就导致了查询不出来。

具体的现象如下所示:

1、现象描述

前面已经简单说了情况,我数据库里面存的是这样子的:

复制代码
C:\\Program Files\\WPS Office\\12.1.0.16250\\wtoolex\\wpsupdate.exe

但是你如果取出数据然后打印出来,他也是单反斜杠,因为打印的时候他认为两个单反斜杠其中一个是转义字符,但是数据库里面本质是存的两个反斜杠,你把数据取出来写到文件里面看,就是两个单反斜杠。

然后我发给前端,前端收到的也是双反斜杠的,但是就显示的就是单斜杠,所以查询的时候考妣网页显示单反斜杠的路径去模糊查询是查询不到的。

2、解决办法

当时我想到的解决办法有两种,一种就是让前端直接显示全部的字符串,即显示两个反斜杠的字符串,然后用户到时候直接复制来进行模糊查询即可,前端的处理方法我目前不知道咋个实现,应该还是可以实现的,我做后端的,这里讲下我后端怎么实现的:

后端的实现方法就是将原来的单反斜杠给他变成双反斜杠,我之前找了很久,一直没找到实现的方法,最后无意中找到了,使用fmt.Sprintf就可以实现。具体实现代码如下所示

复制代码
strjelly := `C:\jelly\path`
strjelly = fmt.Sprintf("%#v", strjelly)
num := len(strjelly)
fmt.Println(num)
fmt.Println(strjelly)
fmt.Println(strjelly[1 : num-1])

代码中,假设你的字符串变量是strjelly,字符串里面含有两个单反斜杠,然后经过fmt.Sprintf("%#v", strjelly)处理后,里面的单反斜杠就会变成双反斜杠,但是这样转换后不能直接用,因为这样转换后,他会前后多字符串引号,需要使用strjelly[1 : num-1])把前后的两个引号字符给去掉,具体的打印如下所示:

复制代码
17
"C:\\jelly\\path"
C:\\jelly\\path

可以看到,经过fmt.Sprintf处理后,字符串的长度多了4,原来的字符串数一下是13,为什么多个4呢,因为转换后两个单反斜杠变成了双反斜杠,增加了2,然后前后多了一个引号,增加了2,一共就是增加了4。然后再使用strjelly[1 : num-1]去掉前后的两个引号即可。

3、总结

以上就是记录的单反斜杠转双反斜杠的记录,本方法是针对go语言的,可能场景比较特殊,不是非常适用,也记录下来,方便后续查询。其实最开始的时候,比较困惑,因为打印出来就是单反斜杠,然后读出来用文件保存下来又是双反斜杠,还是折腾的比较久。最后经过查询,猜测,验证,终于明白了其中的关键,其实当时使用打印字符串的长度估计也能知道其中的蹊跷所在。

相关推荐
dhxhsgrx3 小时前
PYTHON训练营DAY25
java·开发语言·python
风逸hhh5 小时前
python打卡day25@浙大疏锦行
开发语言·python
刚入门的大一新生5 小时前
C++初阶-string类的模拟实现与改进
开发语言·c++
chxii6 小时前
5java集合框架
java·开发语言
老衲有点帅7 小时前
C#多线程Thread
开发语言·c#
C++ 老炮儿的技术栈7 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
IsPrisoner7 小时前
Go语言安装proto并且使用gRPC服务(2025最新WINDOWS系统)
开发语言·后端·golang
littleschemer7 小时前
Go基于plugin的热更新初体验
golang·plugin·热更新
Python私教7 小时前
征服Rust:从零到独立开发的实战进阶
服务器·开发语言·rust