以下の内容はhttps://devlights.hatenablog.com/entry/2025/09/18/073000より取得しました。


Goメモ-617 (go-task/slim-sprigを使ってテンプレート処理)(masterminds/sprigのフォーク)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。たまに使いたいときに諸々忘れているので、ここにメモメモ。。。

slim-sprigは、Task内部で利用されているテンプレート向け共通ユーティリティです。

元々、sprig というライブラリがあり、それを Task チームがフォークしてスリム版としてリリースしている模様。

使い方は、本家の sprig と同じで、Template.Funcs にそれぞれのライブラリの関数マップを渡すだけです。

  • masterminds/sprig
import "github.com/Masterminds/sprig/v3"

template.New("xxx").Funcs(sprig.FuncMap())
  • go-task/slim-sprig
import "github.com/go-task/slim-sprig/v3"

template.New("xxx").Funcs(sprig.FuncMap())

本家の方が関数多いのですが、実際に利用する関数って大抵決まっているので、個人的にスリムな方を使うことが多いです。

サンプル

slimsprig/load/main.go

package main

import (
    "cmp"
    "fmt"
    "log"
    "maps"
    "slices"
    "text/template"

    sprig "github.com/go-task/slim-sprig/v3"
)

func main() {
    log.SetFlags(0)

    if err := run(); err != nil {
        log.Fatal(err)
    }
}

func run() error {
    //
    // slim-sprigの関数マップをロードしてテンプレート処理
    //
    const (
        TEXT = `
{{- .Str | upper | repeat 3}} {{now | date "2006-01-02"}}
{{list "hello" "world" | join "-"}}`
    )
    var (
        m   = sprig.FuncMap()
        t   = template.Must(template.New("my").Funcs(m).Parse(TEXT))
        d   = map[string]any{"Str": "hello"}
        err error
    )
    if err = t.Execute(log.Writer(), d); err != nil {
        return err
    }

    //
    // ライブラリで公開される関数を出力
    //
    log.Println("\n------- funcs")

    const (
        nChunks = 8
    )
    var (
        funcNames = slices.Collect(maps.Keys(m))
        maxWords  = slices.MaxFunc(funcNames, func(x, y string) int {
            return cmp.Compare(len(x), len(y))
        })
    )
    slices.Sort(funcNames)
    {
        for chunk := range slices.Chunk(funcNames, nChunks) {
            for name := range slices.Values(chunk) {
                fmt.Fprintf(log.Writer(), "%-*s", len(maxWords)+1, name)
            }

            log.Println("")
        }
    }
    log.Println("")

    return nil
}

Go1.23で追加された iter サポートのお陰で、スライスの処理は本当に楽になりましたねー。チャンク処理とか自前で書かなくて良いのは楽です。

Taskfile.yml

# https://taskfile.dev

version: '3'

tasks:
  default:
    cmds:
      - go run .

実行結果

$ task
task: [default] go run .
HELLOHELLOHELLO 2025-09-08
hello-world
------- funcs
add                        add1                       adler32sum                 ago                        all                        any                        append                     atoi
b32dec                     b32enc                     b64dec                     b64enc                     base                       biggest                    cat                        ceil
chunk                      clean                      coalesce                   compact                    concat                     contains                   date                       dateInZone
dateModify                 date_in_zone               date_modify                deepEqual                  default                    dict                       dig                        dir
div                        duration                   durationRound              empty                      env                        expandenv                  ext                        fail
first                      float64                    floor                      fromJson                   get                        getHostByName              has                        hasKey
hasPrefix                  hasSuffix                  hello                      htmlDate                   htmlDateInZone             indent                     initial                    int
int64                      isAbs                      join                       keys                       kindIs                     kindOf                     last                       list
lower                      max                        maxf                       min                        minf                       mod                        mul                        mustAppend
mustChunk                  mustCompact                mustDateModify             mustFirst                  mustFromJson               mustHas                    mustInitial                mustLast
mustPrepend                mustPush                   mustRegexFind              mustRegexFindAll           mustRegexMatch             mustRegexReplaceAll        mustRegexReplaceAllLiteral mustRegexSplit
mustRest                   mustReverse                mustSlice                  mustToDate                 mustToJson                 mustToPrettyJson           mustToRawJson              mustUniq
mustWithout                must_date_modify           nindent                    now                        omit                       osBase                     osClean                    osDir
osExt                      osIsAbs                    pick                       pluck                      plural                     prepend                    push                       quote
randInt                    regexFind                  regexFindAll               regexMatch                 regexQuoteMeta             regexReplaceAll            regexReplaceAllLiteral     regexSplit
repeat                     replace                    rest                       reverse                    round                      seq                        set                        sha1sum
sha256sum                  slice                      sortAlpha                  split                      splitList                  splitn                     squote                     sub
substr                     ternary                    title                      toDate                     toDecimal                  toJson                     toPrettyJson               toRawJson
toString                   toStrings                  trim                       trimAll                    trimPrefix                 trimSuffix                 trimall                    trunc
tuple                      typeIs                     typeIsLike                 typeOf                     uniq                       unixEpoch                  unset                      until
untilStep                  upper                      urlJoin                    urlParse                   values                     without

参考情報

GitHub - go-task/slim-sprig: Useful template functions for Go templates.

GitHub - Masterminds/sprig: Useful template functions for Go templates.

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。




以上の内容はhttps://devlights.hatenablog.com/entry/2025/09/18/073000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14