我尝试使用 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的建议并使用命名参数。