dongnaigu2052 2017-02-22 11:48
浏览 80
已采纳

取消缩进多行字符串值

I don't like the Go convention for multiline strings:

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.
      `
    }
  }
}

I prefer:

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

Efficiency isn't a concern.

How do I remove a fixed number of spaces from the start of each line in my string value?

  • 写回答

2条回答 默认 最新

  • dongyun8891 2017-02-22 11:58
    关注

    That's a simple strings.Replace() call:

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

    Output before and after the replace (try it on the 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.
    

    Note that this will still leave newline character at the beginning and at the end of your text. If you also want to get rid of them, you may use strings.Trim():

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

    Note: strings.TrimSpace() would come first to mind, but it's not a good choice as that would also remove the indentation from the first line (" Lorem") which is unwanted. We really just want to get rid of extra prefix and postfix newlines.

    To verify the difference:

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

    Output:

    " 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."

    To wrap it in a helper function:

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

    And using it:

    text = unindent(text, 8)
    

    An alternative way to create the old replaceable string:

    func unindent(s string, spaces int) string {
        old := fmt.Sprintf("%*c", -spaces-1, '
    ')
        s = strings.Replace(s, old, "
    ", -1)
        return strings.Trim(s, "
    ")
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 Windows Server 2016利用兩張網卡處理兩個不同網絡
  • ¥15 Python中knn问题
  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源