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

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

ただいまの
回答率

90.47%

  • Go

    544questions

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

templateファイル読み込まれない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 676
退会済みユーザー

退会済みユーザー

Go言語を学んでいます。
チュートリアル(golang.jp)を行っているのですが、TemplateFileの読み込みがうまくいきません。

package main

import (
    "net/http"
    "io/ioutil"
    "os"
    "regexp"
    "template"
)

type Page struct {
    Title string
    Body  []byte
}

func (p *Page) save() os.Error {
    filename := p.Title + ".txt"
    return ioutil.WriteFile(filename, p.Body, 0600)
}

func loadPage(title string) (*Page, os.Error) {
    filename := title + ".txt"
    body, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    return &Page{Title: title, Body: body}, nil
}

func viewHandler(w http.ResponseWriter, r *http.Request, title string) {
    p, err := loadPage(title)
    if err != nil {
        http.Redirect(w, r, "/edit/"+title, http.StatusFound)
        return
    }
    renderTemplate(w, "view", p)
}

func editHandler(w http.ResponseWriter, r *http.Request, title string) {
    p, err := loadPage(title)
    if err != nil {
        p = &Page{Title: title}
    }
    renderTemplate(w, "edit", p)
}

func saveHandler(w http.ResponseWriter, r *http.Request, title string) {
    body := r.FormValue("body")
    p := &Page{Title: title, Body: []byte(body)}
    err := p.save()
    if err != nil {
        http.Error(w, err.String(), http.StatusInternalServerError)
        return
    }
    http.Redirect(w, r, "/view/"+title, http.StatusFound)
}

var templates = make(map[string]*template.Template)

func init() {
    for _, tmpl := range []string{"edit", "view"} {
        templates[tmpl] = template.MustParseFile(tmpl+".html", nil)
    }
}

func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) {
    err := templates[tmpl].Execute(w, p)
    if err != nil {
        http.Error(w, err.String(), http.StatusInternalServerError)
    }
}

const lenPath = len("/view/")

var titleValidator = regexp.MustCompile("^[a-zA-Z0-9]+$")

func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        title := r.URL.Path[lenPath:]
        if !titleValidator.MatchString(title) {
            http.NotFound(w, r)
            return
        }
        fn(w, r, title)
    }
}

func main() {
    http.HandleFunc("/view/", makeHandler(viewHandler))
    http.HandleFunc("/edit/", makeHandler(editHandler))
    http.HandleFunc("/save/", makeHandler(saveHandler))
    http.ListenAndServe(":8080", nil)
}
<h1>Editing {Title}</h1>

<form action="/save/{Title}" method="POST">
<div><textarea name="body" rows="20" cols="80">{Body|html}</textarea></div>
<div><input type="submit" value="Save"></div>
</form>
<h1>{Title}</h1>

<p>[<a href="/edit/{Title}">edit</a>]</p>

<div>{Body}</div>

まだできていないところがあるとは思いますが、htmlは表示されるのではないかと思っていたら、以下のようなことが出てきました。

これは、フォルダの置き方が悪いのか、なんなのかよくわかりません。

cannot find package "template" in any of:
    /usr/local/Cellar/go/1.6.2/libexec/src/template (from $GOROOT)
    /Users/hn/tutorial/src/template (from $GOPATH)

これはそのフォルダにGOPATH.GOROOTが通っていないということでしょうか。
それともtemplate自体もう対応していないのでしょうか。

negroniだとpublicを置いておけば読み込んでくれるだとか書いてはありますが、使わない場合どうしたらいいのかよくわかりません。

プログラミングの経験が少なくよくわかっていません。

どなたかお教えいただけないでしょうか。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kokardy

    2016/05/22 00:48

    とりあえず ・(チュートリアルの)どの部分でエラーがでたのか ・エラーは省かず全部コピペする で、回答がつきやすくなると思います。 ちなみにgolang.jpはバージョンが古いと思います。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/05/22 11:31

    そうなんですね。ありがとうございます。 編集してみました。

    キャンセル

回答 1

checkベストアンサー

0

cannot find package "template" in any of:
のメッセージは「以下の場所にtemplateなんてパッケージねーよ」ってことです。
最初のimport内の"template"を"html/template"に変更でどうですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/23 00:37

    変更してみましたが、エラーは増えていきます。
    undefined: os.Error
    undefined: os.Error
    undefined: "html/template".MustParseFile
    err.String undefined (type error has no field or method String)

    バージョンが古いとおっしゃっていたので、色々な部分がダメな気がしてきました。
    また書き直したりも試してみようと思います。

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Go

    544questions

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