我尝试使用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
的错误。
有什么想法吗?
答案 0 :(得分:5)
使用printf
构建查询是一个坏主意,它可以让您注意SQL注入。
请参阅sql包中的命名参数。
答案 1 :(得分:1)
字符串谓词没有#Sprintf标志(标志#例如为十六进制值添加0x:%#x)。所以删除它,让你的兽医麻烦消失:
myStr := "test"
str := Sprintf("SELECT ... WHERE a = '%[1]s' or b = '%[1]s'", myStr)
fmt.Println(str)
但是:如果你构造的查询的任何部分(myStr)来自外部输入(即用户输入),你真的应该遵循Hein的建议并使用命名参数。