Go中长字符串文字的最佳实践

jos*_*hlf 21 string idioms literals go

我在Go中有一个长字符串文字:

db.Exec("UPDATE mytable SET (I, Have, Lots, Of, Fields) = ('suchalongvalue', 'thisislongaswell', 'ohmansolong', 'wowsolong', 'loooooooooooooooooooooooooong')")
Run Code Online (Sandbox Code Playgroud)

我认为有两种方法可以使它更易于管理:原始引号或多个连接引号:

db.Exec(`UPDATE mytable SET (I, Have, Lots, Of, Fields) 
         = ('suchalongvalue', 'thisislongaswell', 'ohmansolong', 
            'wowsolong', 'loooooooooooooooooooooooooong')`)

db.Exec("UPDATE mytable SET (I, Have, Lots, Of, Fields) = " + 
    "('suchalongvalue', 'thisislongaswell', 'ohmansolong', " +
    "'wowsolong', 'loooooooooooooooooooooooooong')")
Run Code Online (Sandbox Code Playgroud)

第一个感觉更正确,但前面的空格将包含在字符串中,使得结果字符串在其中具有尴尬的空格.这些被认为是惯用的Go吗?

小智 7

这就是我所做的:

q := `UPDATE mytable SET (I, Have, Lots, Of, Fields) = ` +
     `('suchalongvalue', ` + 
     `'thisislongaswell', ` +
     `'wowsolong', ` + 
     `loooooooooooooooooooooooooong')`

db.Exec(q)
Run Code Online (Sandbox Code Playgroud)

我认为它看起来干净很多


cap*_*aig 5

像这样将长字符串文字放入参数中看起来很奇怪。我会比较喜欢:

const updateQuery=`
UPDATE mytable SET (I, Have, Lots, Of, Fields) 
= ('suchalongvalue', 'thisislongaswell', 'ohmansolong', 
'wowsolong', 'loooooooooooooooooooooooooong')`

func doUpdate(){
  db.Exec(updateQuery)
}
Run Code Online (Sandbox Code Playgroud)

我也更喜欢在开头使用一个换行符,而不是每行中的奇数空格。这样,strings.Trim如果它引起问题,您就可以杀死它。


小智 5

我更喜欢:

var updateStatement = `
    UPDATE
        mytable
    SET
        I = 'suchalongvalue'
        ,Have = 'thisislongaswell'
        ,Lots = 'ohmansolong'
        ,Of = 'wowsolong'
        ,Fields = 'loooooooooooooooooooooooooong'
`
func update(updateStatement string) {
    db.Exec(updateStatement)
}
Run Code Online (Sandbox Code Playgroud)

看起来应该干净得多。至少这是教给我的。


Seb*_*tos 2

你可以这样做:

s := `UPDATE mytable SET (I, Have, Lots, Of, Fields) = `
s += `('suchalongvalue', `
s += `'thisislongaswell', `
s += `'wowsolong', `
s += `loooooooooooooooooooooooooong')`

db.Exec(s)
Run Code Online (Sandbox Code Playgroud)

  • 这是相当低效的,因为字符串是不可变的。每个“+=”将分配一个新字符串。如果您必须这样做(而不是原始引号),请考虑使用“bytes.Buffer”。 (13认同)