【问题标题】:How to approach string formatting in templates如何在模板中处理字符串格式
【发布时间】:2014-08-06 15:28:57
【问题描述】:

我将一个结构传递给一个模板,该模板有时包含有点太长而无法显示的字符串。在任何其他语言中,我都会在模板本身中附加一个格式规则。在模板中完成格式化的惯用方法是什么?

例子:

type struct MyStruct{
    something    string
    anotherThing string
}

在模板中

<table>
{{ range .Rows }}      //NOTE! Rows is an array of MyStruct objects 
<tr>
<td>{{ .something }}</td>
<td>{{ .anotherThing }}</td>        
</tr>
{{ end }}
</table>

如果从上面看不明显,问题是“你将如何确保 .anotherThing 或 .something 不显示超过 40 个字符?

一种解决方案可能是使结构包含四个值,两个原始字符串和它们的两个格式化版本,即在 .go-file 中进行格式化,然后始终在悬停或类似的工具提示中显示原始字符串那个。

【问题讨论】:

    标签: templates go


    【解决方案1】:

    您可以向FuncMap 添加自定义截断函数。有人在操场上发了一个example,把模板变量转换成大写,像这样:

    {{ .Name | ToUpper  }}
    

    编辑。将上述代码调整为基本的Truncate 过滤器:http://play.golang.org/p/e0eaf-fyrH

    {{ .Name | Truncate  }}
    

    如果你想给Truncate传递一个参数,你也可以这样写:

    {{ Truncate .Name 3 }}
    

    另见:http://play.golang.org/p/Gh3JY1wzcF

    【讨论】:

    • 我以前见过这个,但这似乎是一种非常落后的方式来完成应该很容易的事情。我几乎宁愿用原始+格式化值来扩展我的结构。同样感谢您提供答案。
    • @Adergaard 好吧,如果您对数据执行此操作,那么您会将显示逻辑与数据混合并复制它。我建议不要这样做。使用模板函数。这是干净的方法。
    • 是的。你可能是对的。我将其设置为正确。
    【解决方案2】:

    除了使用自定义函数之外,一种方法是使用Stringer 接口定义您自己的类型:

    type ShortString string
    
    func(ss ShortString) String() string {
        if len(ss) > 10 {
            return string(ss[:5]) + "..."
        }
        return string(ss)
    }
    
    type MyStruct struct {
        Something    ShortString
    }
    

    playground 显示两种方法。

    【讨论】:

      猜你喜欢
      • 2018-05-02
      • 2014-05-04
      • 2014-02-28
      • 1970-01-01
      • 2013-11-25
      • 2016-12-28
      • 2014-05-29
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多