Go言語を学んでいます。
チュートリアル(golang.jp)を行っているのですが、TemplateFileの読み込みがうまくいきません。
Go
1package main 2 3import ( 4 "net/http" 5 "io/ioutil" 6 "os" 7 "regexp" 8 "template" 9) 10 11type Page struct { 12 Title string 13 Body []byte 14} 15 16func (p *Page) save() os.Error { 17 filename := p.Title + ".txt" 18 return ioutil.WriteFile(filename, p.Body, 0600) 19} 20 21func loadPage(title string) (*Page, os.Error) { 22 filename := title + ".txt" 23 body, err := ioutil.ReadFile(filename) 24 if err != nil { 25 return nil, err 26 } 27 return &Page{Title: title, Body: body}, nil 28} 29 30func viewHandler(w http.ResponseWriter, r *http.Request, title string) { 31 p, err := loadPage(title) 32 if err != nil { 33 http.Redirect(w, r, "/edit/"+title, http.StatusFound) 34 return 35 } 36 renderTemplate(w, "view", p) 37} 38 39func editHandler(w http.ResponseWriter, r *http.Request, title string) { 40 p, err := loadPage(title) 41 if err != nil { 42 p = &Page{Title: title} 43 } 44 renderTemplate(w, "edit", p) 45} 46 47func saveHandler(w http.ResponseWriter, r *http.Request, title string) { 48 body := r.FormValue("body") 49 p := &Page{Title: title, Body: []byte(body)} 50 err := p.save() 51 if err != nil { 52 http.Error(w, err.String(), http.StatusInternalServerError) 53 return 54 } 55 http.Redirect(w, r, "/view/"+title, http.StatusFound) 56} 57 58var templates = make(map[string]*template.Template) 59 60func init() { 61 for _, tmpl := range []string{"edit", "view"} { 62 templates[tmpl] = template.MustParseFile(tmpl+".html", nil) 63 } 64} 65 66func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) { 67 err := templates[tmpl].Execute(w, p) 68 if err != nil { 69 http.Error(w, err.String(), http.StatusInternalServerError) 70 } 71} 72 73const lenPath = len("/view/") 74 75var titleValidator = regexp.MustCompile("^[a-zA-Z0-9]+$") 76 77func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc { 78 return func(w http.ResponseWriter, r *http.Request) { 79 title := r.URL.Path[lenPath:] 80 if !titleValidator.MatchString(title) { 81 http.NotFound(w, r) 82 return 83 } 84 fn(w, r, title) 85 } 86} 87 88func main() { 89 http.HandleFunc("/view/", makeHandler(viewHandler)) 90 http.HandleFunc("/edit/", makeHandler(editHandler)) 91 http.HandleFunc("/save/", makeHandler(saveHandler)) 92 http.ListenAndServe(":8080", nil) 93}
edit.html
1<h1>Editing {Title}</h1> 2 3<form action="/save/{Title}" method="POST"> 4<div><textarea name="body" rows="20" cols="80">{Body|html}</textarea></div> 5<div><input type="submit" value="Save"></div> 6</form>
view.html
1<h1>{Title}</h1> 2 3<p>[<a href="/edit/{Title}">edit</a>]</p> 4 5<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を置いておけば読み込んでくれるだとか書いてはありますが、使わない場合どうしたらいいのかよくわかりません。
プログラミングの経験が少なくよくわかっていません。
どなたかお教えいただけないでしょうか。
よろしくお願いいたします。
とりあえず
・(チュートリアルの)どの部分でエラーがでたのか
・エラーは省かず全部コピペする
で、回答がつきやすくなると思います。
ちなみにgolang.jpはバージョンが古いと思います。
そうなんですね。ありがとうございます。
編集してみました。
回答1件
あなたの回答
tips
プレビュー