Go
http.Redirect() 303、307の例をお見せします。 記述内容が異なるのは、http.Redirect()の第4引数のみです。 templateであるindex.gohtmlです。 formのaction属性に「/bar」を指定します。 <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="POST" action="/bar"> <input type="text" name="fname"> </form></body></html>
http.Requestのポインタをレシーバに持つFormFile()を使います。 次のような階層があるとして、 main.go templates index.gohtml filestore (作成したファイルを格納) formのinputからファイルを読み込み、 filestoreフォルダに新たなファイルを作成、 読み…
強制的に404 Not Found Errorを返します。 例えばfavicon.icoを配置していないと、ブラウザによってはアクセスする度にエラーログが吐かれてしまいますが、 http.NotFoundHandler()を使って、"/favicon.ico"に対してHandleを指定すると、 エラーログを出力し…
ResponseWriterにエラーの内容を書き込むことができ、 クライアント側にエラーを認知させることができます。 func pict(w http.ResponseWriter, req *http.Request) { f, err := os.Open("pict.png") if err != nil { http.Error(w, "file not found", 404) …
http.Handle()とhttp.FileServer()を用いた、サーブ方法には問題となる点がありました。 http.FileServer()で階層ごと複数ファイルをサーブする【Go】 - 技術向上 http.Handle("/abc/", http.FileServer(http.Dir("templates"))) 上記の場合、/abc/にアクセ…
http.FileServer()関数を使って、階層ごと複数ファイルをサーブすることができます。 返り値の型はHandlerです。 よって、指定されたURLにアクセスされた際にHandlerを実行する、 http.Handle()関数の第2引数に指定することができます。 func http.FileServe…
ファイルをサーバーにあげる際に利用します。 io.Copyと比較して、各種ヘッダー情報を付加、利用できる点で利があります。 それはContet-Range、MIMEタイプ、ETagを利用したIf-MatchとIf-None-Match、 If-Range、 さらにIf-Unmodified-Sinceなどで、正確に、…
Reader経由でファイルをコピーして、Writerを通して出力します。 func pict(w http.ResponseWriter, req *http.Request) { // HandlerFunc()の第2引数に指定するため、この形式 f, err := os.Open("pict.png") // ファイルを開き、Readerが使える状態にして…
packageの紹介 こちらのhttprouter packageは、net/http packageのServeMuxよりもルーティングが高速で、かつ使いやすいと評判です。 GitHub - julienschmidt/httprouter: A high performance HTTP request router that scales well パフォーマンスについて…
http.RequestのFormValue()メソッドを使用すると、 queryパラメータから、keyを指定した値の取得ができます。 http packageのHandler型へのダックタイピングを、hotdogという型に対して行う例で解説します。 Handler型はinterface型であり、ServeHTTP()メソ…
http.Requestからformの値を取得するには、 http.Requestのメソッド、ParseForm()事前に実行する必要があります。 その上で、formの値が格納されているhttp.Requestのフィールド(url.Values型)にアクセスします。 formの値が格納されるフィールドには、For…
クライアントサイドの処理を行うプログラムを作成します。 netパッケージのDialメソッドを使用します。 サーバーの役割を担うproject、main.goファイル、 サーバーに対してアクセスする、クライアントの役割を担う別のproject、main.goファイルを用意します…
net.ConnのSetDeadline()メソッドを使うと、 接続の有効期限を指定することができます。 func main() { li, err := net.Listen("tcp", ":8080") if err != nil { log.Fatal(err) } for { conn, err := li.Accept() if err != nil { log.Fatal(err) } go hand…
bufio packageのScannerを使って1行ずつ読み込むことができます。 TCP接続した情報を読み込む例を示します。 main.goです。 func main() { li, err := net.Listen("tcp", ":8080") if err != nil { log.Fatal(err) } for { conn, err := li.Accept() if err …
HTTPで動作するサーバーを作成するため、 TCPサーバーを、標準パッケージのnet packageを使って作成します。 TCPはサーバーとクライアント間の接続を事前に確立し、 通信相手ごとに通信の状態を管理します。 それゆえに信頼性は高いですが、コストのかかる通…
html/templateは、text/templateの拡張版です。 text/templateの全ての機能を、html/templateは備えています。 それに加えて、htmlに必要な機能を併せ持っています。 例えば文字エスケープです。XSS対策になります。 main.goです。 text/templateをimportし…
templateファイルの中で、goファイル上で記述したメソッドを使用することができます。 メソッドを定義していないtypeに対して使おうとすると、エラーが発生します。 引数あり main.goです。 var tpl *template.Template type Team struct { Name string Est …
goファイルからtemplateへ渡すdataを、structを使って構造化します。 main.goです。 NPBの中にLeagueのポインタ型が2つ、Leagueの中にTeamのポインタ型のスライスがあります。 var tpl *template.Template type Team struct { Name string Est int } type Le…
templateを複数に分割して識別し、組み立てる時に識別名によって呼び出すことができます。 階層は次の通りになっているとします。 main.go templates tpl.gohtml parts.gohtml まずはmain.goです。 var tpl *template.Template func init() { tpl = template…
下記のように、「{{ }}」で囲まれたコメント専用スペースを作り、 「/ /」の中にコメントを書きます。 {{ /* This is a Name list. */ }} <ul> {{ range . }} <li>{{ .Name }}</li> {{ end }} </ul>
templateでは、組み込み関数(ビルドイン関数)を、自作のgoファイルに定義せずに使用することができます。 templateファイルに直接記入することができるのです。 main.goが次のようになっているとします。 type user struct { Name string Admin bool } fun…
template.FuncMapとFuncs()を用いることで、 templateに対して関数を登録する事ができます。 階層が次のようになっているとします。 main.go templates blabla.gohtml tpl1.gohtml tpl2.gohtml main.goの内容です。 var tpl *template.Template var fm = tem…
templateへのデータ渡しを、goファイル上で指定する事ができます。 intやstring 階層が次のようになっているとします。 main.go templates blabla.gohtml tpl1.gohtml tpl2.gohtml main.goの内容です。 var tpl *template.Template func init() { tpl = temp…
"Glob"は「掴む」を意味する通り、 引数に指定した「パターンに合致する」複数のファイルを templateとして取り込む事ができます。 階層が次のようになっているとします。 main.go templates blabla.gohtml tpl1.gohtml tpl2.gohtml main関数が次のように書…
templateとして外部ファイルを取り込むメソッドです。 tpl, err := template.ParseFiles("tpl.gohtml") // tpl.gohtmlというファイルを取り込む if err != nil { log.Fatal(err) } err = tpl.Execute(os.Stdout, nil) // 画面出力する。適用するdataはないの…
index.htmlを作成し、ターミナルでの実行時に、 出力される変数に代入する内容を指定します。 name := os.Args[1] // ターミナルで実行した時の第2引数を代入 fmt.Println(os.Args[0]) // 実行対象のファイル(第1引数) fmt.Println(os.Args[1]) // 実行時…
オブジェクト指向のデザインパターンである、Singletonを実装する例です。 type Menu struct { name string price int } var mymenu *Menu = newMenu("未定", 0) // 定義時に func newMenu(name string, price int) *Menu { // コンストラクタのように初期化…
SQL(sqlite3)によってDBから取得した内容をhtmlに出力します。 テーブルから取得できる件数は、事前にはわからないため、 テンプレートとして使用するhtml側でループ処理を施す必要があります。 まずはgoファイルのSQL取得処理です。 type Candle struct {…
for rangeの対象が、無限ループによって生成(更新)される場合、 for rangeの処理も終わらないため、下に記述された処理が行われません。 c := make(chan int) go func() { defer close(c) var i int for { // 無限ループ c <- i time.Sleep(1 * time.Secon…
APIを扱うメソッド・関数の返り値について、 structの場合はポインタ渡し、 スライスの場合は値渡しとすることが一般的です。 スライスは配列に対するエイリアスですので、ポインタとする必要性がなく、 structの場合は、コピーが作成されてしまうので ポイ…