首页 文章

取消多行字符串值

提问于
浏览
0

我不喜欢多行字符串的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) ?
    }
  }
}

效率不是问题 .

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

2 回答

  • 2

    这是一个简单的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."

    To wrap it in a helper function:

    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")
    }
    
  • 1

    您可以尝试这不是一个好但简单的方法 .

    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)
    
    
    }
    

相关问题