Golang Sprintf 格式化字符串并多次使用它



我尝试使用 Sprintf() 生成一个 sql 查询,其中我必须使用相同的变量两次

myStr := "test"
str := Sprintf("SELECT ... WHERE a = '%#[1]s' or b = '%#[1]s'", myStr)
fmt.Println(str)

此代码段输出预期的字符串

SELECT ... WHERE a = 'test' or b = 'test'

go vet 说:

unrecognized printf flag for verb 's': '#' (vet)

我很困惑为什么。将 printf 动词切换到 v 满足go vet,但在我的字符串周围增加了"。老实说,我认为使用%#[1]s没有错误.

有什么想法吗?

使用 printf 构造查询是一个坏主意,它打开了 SQL 注入。

请参阅 sql 包中的命名参数。

字符串动词没有 # Sprintf 标志(标志 # 例如,为 hex 值添加 0x: %#x)。因此,将其删除以使您的兽医问题消失:

myStr := "test"
str := Sprintf("SELECT ... WHERE a = '%[1]s' or b = '%[1]s'", myStr)
fmt.Println(str)

但是:如果你构造的查询(myStr)的任何部分来自外部输入(即用户输入),你真的应该遵循Hein的建议并使用命名参数。

最新更新