【问题标题】:Best practice for long string literals in GoGo 中长字符串文字的最佳实践
【发布时间】:2014-01-23 06:43:17
【问题描述】:

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

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')`)

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

第一个感觉更正确,但是前面的空格会包含在字符串中,导致结果字符串中出现尴尬的空格。这些中的任何一个都被认为是惯用的 Go 语言吗?

【问题讨论】:

  • 使用原始引号。忽略带有原始引号的字符串的缩进。
  • “忽略缩进”是什么意思?有没有办法让编译器做到这一点,或者你的意思是我应该使用原始引号而不是在风格上缩进?
  • 没错。使用原始引号时不要在风格上缩进。这就是所有标准代码的作用。
  • @FuZxxl 你想继续回答吗?这是您可以用作示例的链接golang.org/src/cmd/go/main.go#L172 :)
  • @MatrixFrog,我认为您的链接不再相关......

标签: string go literals idioms


【解决方案1】:

你可以这样做:

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

db.Exec(s)

【讨论】:

  • 我使用这种方法将 html 串在一起,同时保持其可读性。此方法允许将字符串分隔为多行而不包含换行符。
  • 这是相当低效的,因为字符串是不可变的。每个+= 将分配一个新字符串。如果您必须这样做(而不是原始引号),请考虑使用bytes.Buffer
【解决方案2】:

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

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

func doUpdate(){
  db.Exec(updateQuery)
}

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

【讨论】:

  • 这是个好主意,虽然我会将常量放在函数中,因为全局范围内不需要它。
  • 如果你的字符串是一个常量,你可以使用任何你喜欢的形式,编译器会为你做连接。只需选择在视觉上更吸引您的任何形式。在任何其他情况下,反引号语法是要走的路。如果您很挑剔,您甚至可以在const updateQuery = 之后立即换行并将第一个反引号放在下一行以正确对齐。
【解决方案3】:

这就是我的工作:

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

db.Exec(q)

我觉得它看起来干净了很多

【讨论】:

    【解决方案4】:

    既然我们在这个例子中讨论的是 SQL……

    INSERTUPDATE 中很少将字符串文字作为列值传递。您几乎总是从代码中传入计算值,在这种情况下,使用参数化查询要好得多。在编译时知道值的极少数情况下,参数化通常仍然是正确的答案:

    _, err := db.Exec(
        `UPDATE mytable SET (I, Have, Lots, Of, Fields) = ($1, $2, $3, $4, $5)`,
        "suchalongvalue",
        "thisislongaswell",
        "ohmansolong",
        "wowsolong",
        "loooooooooooooooooooooooooong")
    

    【讨论】:

    • 这个问题是关于长字符串文字的。
    【解决方案5】:

    我更喜欢:

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

    应该看起来更干净。至少那是教给我的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 2010-11-10
      • 2017-12-01
      • 1970-01-01
      • 2018-03-15
      相关资源
      最近更新 更多