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

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

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

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

Q&A

解決済

1回答

1734閲覧

goのtemplateについて教えてください。

UekiKouji

総合スコア121

Go

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

0グッド

0クリップ

投稿2017/09/11 22:58

goについて勉強しています。以下のサンプルが動かないので、理由がわからないので教えてください。

server.go

package main import ( "html/template" "net/http" ) func process(w http.ResponseWriter, r *http.Request) { t, _ := template.ParseFiles("tmpl.html") t.Execute(w, "Hello World!") } func main() { server := http.Server{ Addr: "127.0.0.1:9000", } http.HandleFunc("/process", process) server.ListenAndServe() }

tmpl.html

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Go Web Programming</title> </head> <body> {{ . }} </body> </html>

このような構造です。
イメージ説明
表示したブラウザ
イメージ説明
エラー内容です。
イメージ説明

go1.9を利用しています。根本的によくわからないのでよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因としては template.ParseFiles の戻り値をチェックしていない事による nil 参照 panic です。

go

1package main 2 3import ( 4 "html/template" 5 "net/http" 6) 7 8func process(w http.ResponseWriter, r *http.Request) { 9 t, err := template.ParseFiles("tmpl.html") 10 if err != nil { 11 http.Error(w, err.Error(), http.StatusInternalServerError) 12 return 13 } 14 t.Execute(w, "Hello World!") 15} 16 17func main() { 18 server := http.Server{ 19 Addr: "127.0.0.1:9000", 20 } 21 http.HandleFunc("/process", process) 22 server.ListenAndServe() 23}

この様に正しくエラーをチェックすべきです。
なぜこのエラーが発生したのかですが、golang は $GOPATH 配下にパッケージを作って開発を行いますが、キャプチャを見る限り main パッケージという物を作っておられる様です。ですのでプロジェクトルートフォルダからビルドしようとすると

go build -o app ./main

となります。ビルドしたバイナリはプロジェクトルートディレクトリに app という実行モジュールが出来ると思います。ただしこれは IDE により生成されるファイル名は違ってきます。プロジェクトルートディレクトリからの実行も

./app

となります。つまり ./main/tmpl.html とは異なるディレクトリにいる事になります。

go

1t, err := template.ParseFiles("tmpl.html")

この行を

go

1t, err := template.ParseFiles("main/tmpl.html")

こう直せば動くと思いますが、そもそも main というフォルダを作る必要は無いと思いますので、main.gotmpl.html をプロジェクトルートディレクトリ(一つ上のディレクトリ)に移動してしまうのが良いと思います。

投稿2017/09/12 01:42

編集2017/09/12 01:45
mattn

総合スコア5030

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

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

mattn

2017/09/12 02:10

もう一つの解決方法としては、ソースコードは何も変更せず tmpl.html を一つ上のディレクトリに移動すれば治ると思います。
UekiKouji

2017/09/13 04:23

ありがとうございます。動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問