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

时间:2017-11-07 10:06:16

标签: go printf

我尝试使用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的错误。

有什么想法吗?

2 个答案:

答案 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的建议并使用命名参数。