質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

2回答

1354閲覧

Golangのtemplate内でスライスを定義したい

退会済みユーザー

退会済みユーザー

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2020/03/15 07:39

前提

Golangでツイッターのような簡単なアプリケーションを作っています

実現したいこと

template内でスライスを定義したい。

Rubyでいうと、以下のようなことがやりたいです

slim

1# index.html.slim 2- array = ["test1", "test2", "test3"] 3= array[0]

発生している問題

これをGolangで実現するには、以下のようにやると認識していました

html

1# index.html 2{{ $array := slice "test1" "test2" "test3" }} 3{{ index $array 0 }}

ですが、実際はこの記述をした箇所から下が真っ白(何も表示されなくなる)になります。

ちなみに、同template内でifrangeなどは普通に使えるので、sliceの定義の仕方だけが悪いと思うのですが、具体的に何が間違っているのか分かりません。

もしご存知の方がいらっしゃいましたら教えていただきたいです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

参考に以下のような手段はあります。

https://play.golang.org/p/T9DSdQWo7ly

go

1package main 2 3import ( 4 "html/template" 5 "os" 6) 7 8const src = `{{$a := array "hello" "world" "!"}}{{$a}}` 9 10func main() { 11 tpl := template.Must(template.New("").Funcs( 12 map[string]interface{}{ 13 "array": func(s ...string) []string { 14 return append([]string{}, s...) 15 }, 16 }, 17 ).Parse(src)) 18 tpl.Execute(os.Stdout, nil) 19}

出力

[hello world !]

投稿2020/03/16 09:25

nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

公式ドキュメントの Functions にある slice の記述を見ると、slice の関数は第一引数に渡された slice のスライスを取るとあります。

slice
slice returns the result of slicing its first argument by the
remaining arguments. Thus "slice x 1 2" is, in Go syntax, x[1:2],
while "slice x" is x[:], "slice x 1" is x[1:], and "slice x 1 2 3"
is x[1:2:3]. The first argument must be a string, slice, or array.

HTML 側で Go の slice を宣言することはできないと思います。
template を処理する Go 側で slice を渡す感じになると思います。

go

1package main 2 3import ( 4 "html/template" 5 "log" 6 "os" 7) 8 9func main() { 10 tpl, err := template.ParseFiles("index.html") 11 if err != nil { 12 log.Fatal(err) 13 } 14 arr := []string{"test1", "test2", "test3"} 15 // 標準出力に出力する例 16 // 適宜 w http.ResponseWriter などに書き込む 17 err = tpl.Execute(os.Stdout, arr) 18 if err != nil { 19 log.Fatal(err) 20 } 21}

投稿2020/03/15 08:23

d_tutuz

総合スコア730

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/15 10:39

なるほど、、やはりHTML側では定義できないんですね、、 責務としてもHTML側には書くべきではないと思うので、goファイル内で定義してから渡すことにします。回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問