取消缩进多行字符串值

Unindent a multiline string value

我不喜欢多行字符串的 Go 约定:

function main() {
  for {
    if something {
      text := `   Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna 
aliqua. 
   Ut enim ad minim veniam, quis nostrud exercitation 
ullamco laboris nisi ut aliquip ex ea commodo consequat.
      `
    }
  }
}

我更喜欢:

function main() {
  for {
    if something {
      text := `
           Lorem ipsum dolor sit amet, consectetur adipiscing elit,
        sed do eiusmod tempor incididunt ut labore et dolore magna
        aliqua. 
           Ut enim ad minim veniam, quis nostrud exercitation 
        ullamco laboris nisi ut aliquip ex ea commodo consequat.
      `
      // text = unindent(text, 8) ?
    }
  }
}

效率不是问题。

如何从字符串值中每行的开头删除固定数量的空格?

这是一个简单的 strings.Replace() 调用:

text = strings.Replace(text, "\n        ", "\n", -1)

替换前后的输出(在Go Playground上试试):

           Lorem ipsum dolor sit amet, consectetur adipiscing elit,
        sed do eiusmod tempor incididunt ut labore et dolore magna
        aliqua. 
           Ut enim ad minim veniam, quis nostrud exercitation 
        ullamco laboris nisi ut aliquip ex ea commodo consequat.


   Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. 
   Ut enim ad minim veniam, quis nostrud exercitation 
ullamco laboris nisi ut aliquip ex ea commodo consequat.

请注意,这仍会在文本的开头和结尾留下换行符。如果你也想摆脱它们,你可以使用 strings.Trim():

text = strings.Replace(text, "\n        ", "\n", -1)
text = strings.Trim(text, "\n")

注意:首先想到的是 strings.TrimSpace(),但这不是一个好的选择,因为这也会删除第一行 (" Lorem") 中不需要的缩进。我们真的只是想摆脱额外的前缀和后缀换行符。

验证差异:

text = strings.Replace(text, "\n        ", "\n", -1)
fmt.Printf("%q\n", text)
text = strings.Trim(text, "\n")
fmt.Printf("%q\n", text)

输出:

"\n Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt ut labore et dolore magna\naliqua. \n Ut enim ad minim veniam, quis nostrud exercitation \nullamco laboris nisi ut aliquip ex ea commodo consequat.\n" " Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt ut labore et dolore magna\naliqua. \n Ut enim ad minim veniam, quis nostrud exercitation \nullamco laboris nisi ut aliquip ex ea commodo consequat."

将其包装在辅助函数中:

func unindent(s string, spaces int) string {
    old := "\n" + strings.Repeat(" ", spaces)
    s = strings.Replace(s, old, "\n", -1)
    return strings.Trim(s, "\n")
}

并使用它:

text = unindent(text, 8)

另一种创建 old 可替换字符串的方法:

func unindent(s string, spaces int) string {
    old := fmt.Sprintf("%*c", -spaces-1, '\n')
    s = strings.Replace(s, old, "\n", -1)
    return strings.Trim(s, "\n")
}

你可以试试这个不太好但简单的方法。

func main() {
    text := "Lorem ipsum dolor sit amet, consectetur adipiscing elit,\n" +
            "sed do eiusmod tempor incididunt ut labore et dolore magna\n" +
            "aliqua.\n" +
            "Ut enim ad minim veniam, quis nostrud exercitation\n" +
            "ullamco laboris nisi ut aliquip ex ea commodo consequat."
    fmt.Println(text)


}