技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

Go

Redirects【Go】

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>

formからfileを読み込む【Go】

Go

http.Requestのポインタをレシーバに持つFormFile()を使います。 次のような階層があるとして、 main.go templates index.gohtml filestore (作成したファイルを格納) formのinputからファイルを読み込み、 filestoreフォルダに新たなファイルを作成、 読み…

http.NotFoundHandler()【Go】

Go

強制的に404 Not Found Errorを返します。 例えばfavicon.icoを配置していないと、ブラウザによってはアクセスする度にエラーログが吐かれてしまいますが、 http.NotFoundHandler()を使って、"/favicon.ico"に対してHandleを指定すると、 エラーログを出力し…

http.Error()【Go】

Go

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.StripPrefix()でフォルダ階層とURLの指定を分離する【Go】

Go

http.Handle()とhttp.FileServer()を用いた、サーブ方法には問題となる点がありました。 http.FileServer()で階層ごと複数ファイルをサーブする【Go】 - 技術向上 http.Handle("/abc/", http.FileServer(http.Dir("templates"))) 上記の場合、/abc/にアクセ…

http.FileServer()で階層ごと複数ファイルをサーブする【Go】

Go

http.FileServer()関数を使って、階層ごと複数ファイルをサーブすることができます。 返り値の型はHandlerです。 よって、指定されたURLにアクセスされた際にHandlerを実行する、 http.Handle()関数の第2引数に指定することができます。 func http.FileServe…

http.ServeContent()【Go】

Go

ファイルをサーバーにあげる際に利用します。 io.Copyと比較して、各種ヘッダー情報を付加、利用できる点で利があります。 それはContet-Range、MIMEタイプ、ETagを利用したIf-MatchとIf-None-Match、 If-Range、 さらにIf-Unmodified-Sinceなどで、正確に、…

io.Copy【Go】

Go

Reader経由でファイルをコピーして、Writerを通して出力します。 func pict(w http.ResponseWriter, req *http.Request) { // HandlerFunc()の第2引数に指定するため、この形式 f, err := os.Open("pict.png") // ファイルを開き、Readerが使える状態にして…

速くて簡単。サードパーティのServeMux【Go】

Go

packageの紹介 こちらのhttprouter packageは、net/http packageのServeMuxよりもルーティングが高速で、かつ使いやすいと評判です。 GitHub - julienschmidt/httprouter: A high performance HTTP request router that scales well パフォーマンスについて…

http.Request queryパラメータからkeyで値を取得する【Go】

Go

http.RequestのFormValue()メソッドを使用すると、 queryパラメータから、keyを指定した値の取得ができます。 http packageのHandler型へのダックタイピングを、hotdogという型に対して行う例で解説します。 Handler型はinterface型であり、ServeHTTP()メソ…

http.Requestからformの値を取得する【Go】

Go

http.Requestからformの値を取得するには、 http.Requestのメソッド、ParseForm()事前に実行する必要があります。 その上で、formの値が格納されているhttp.Requestのフィールド(url.Values型)にアクセスします。 formの値が格納されるフィールドには、For…

TCP Dial【Go】

Go

クライアントサイドの処理を行うプログラムを作成します。 netパッケージのDialメソッドを使用します。 サーバーの役割を担うproject、main.goファイル、 サーバーに対してアクセスする、クライアントの役割を担う別のproject、main.goファイルを用意します…

TCP SetDeadline【Go】

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…

TCP scanner【Go】

Go

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 …

TCP write【Go】

Go

HTTPで動作するサーバーを作成するため、 TCPサーバーを、標準パッケージのnet packageを使って作成します。 TCPはサーバーとクライアント間の接続を事前に確立し、 通信相手ごとに通信の状態を管理します。 それゆえに信頼性は高いですが、コストのかかる通…

html/templateとtext/template【Go】

Go

html/templateは、text/templateの拡張版です。 text/templateの全ての機能を、html/templateは備えています。 それに加えて、htmlに必要な機能を併せ持っています。 例えば文字エスケープです。XSS対策になります。 main.goです。 text/templateをimportし…

templateに渡したdataに対してメソッドを使用する【Go】

Go

templateファイルの中で、goファイル上で記述したメソッドを使用することができます。 メソッドを定義していないtypeに対して使おうとすると、エラーが発生します。 引数あり main.goです。 var tpl *template.Template type Team struct { Name string Est …

templateに渡すdataの構造化【Go】

Go

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の分離と組み立て【Go】

Go

templateを複数に分割して識別し、組み立てる時に識別名によって呼び出すことができます。 階層は次の通りになっているとします。 main.go templates tpl.gohtml parts.gohtml まずはmain.goです。 var tpl *template.Template func init() { tpl = template…

templateにコメントを書く【Go】

Go

下記のように、「{{ }}」で囲まれたコメント専用スペースを作り、 「/ /」の中にコメントを書きます。 {{ /* This is a Name list. */ }} <ul> {{ range . }} <li>{{ .Name }}</li> {{ end }} </ul>

templateと組み込み関数【Go】

Go

templateでは、組み込み関数(ビルドイン関数)を、自作のgoファイルに定義せずに使用することができます。 templateファイルに直接記入することができるのです。 main.goが次のようになっているとします。 type user struct { Name string Admin bool } fun…

template.FuncMap【Go】

Go

template.FuncMapとFuncs()を用いることで、 templateに対して関数を登録する事ができます。 階層が次のようになっているとします。 main.go templates blabla.gohtml tpl1.gohtml tpl2.gohtml main.goの内容です。 var tpl *template.Template var fm = tem…

templateへのデータ渡し【Go】

Go

templateへのデータ渡しを、goファイル上で指定する事ができます。 intやstring 階層が次のようになっているとします。 main.go templates blabla.gohtml tpl1.gohtml tpl2.gohtml main.goの内容です。 var tpl *template.Template func init() { tpl = temp…

template.ParseGlob()【Go】

Go

"Glob"は「掴む」を意味する通り、 引数に指定した「パターンに合致する」複数のファイルを templateとして取り込む事ができます。 階層が次のようになっているとします。 main.go templates blabla.gohtml tpl1.gohtml tpl2.gohtml main関数が次のように書…

template.ParseFiles()【Go】

Go

templateとして外部ファイルを取り込むメソッドです。 tpl, err := template.ParseFiles("tpl.gohtml") // tpl.gohtmlというファイルを取り込む if err != nil { log.Fatal(err) } err = tpl.Execute(os.Stdout, nil) // 画面出力する。適用するdataはないの…

ターミナルからtemplateに出力する内容を指定する【Go】

Go

index.htmlを作成し、ターミナルでの実行時に、 出力される変数に代入する内容を指定します。 name := os.Args[1] // ターミナルで実行した時の第2引数を代入 fmt.Println(os.Args[0]) // 実行対象のファイル(第1引数) fmt.Println(os.Args[1]) // 実行時…

Singleton【Go】

Go

オブジェクト指向のデザインパターンである、Singletonを実装する例です。 type Menu struct { name string price int } var mymenu *Menu = newMenu("未定", 0) // 定義時に func newMenu(name string, price int) *Menu { // コンストラクタのように初期化…

htmlに出力する際のループ処理【Go】

Go

SQL(sqlite3)によってDBから取得した内容をhtmlに出力します。 テーブルから取得できる件数は、事前にはわからないため、 テンプレートとして使用するhtml側でループ処理を施す必要があります。 まずはgoファイルのSQL取得処理です。 type Candle struct {…

rangeの無限ループとgoroutine【Go】

Go

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を扱うメソッド・関数の返り値【Go】

Go

APIを扱うメソッド・関数の返り値について、 structの場合はポインタ渡し、 スライスの場合は値渡しとすることが一般的です。 スライスは配列に対するエイリアスですので、ポインタとする必要性がなく、 structの場合は、コピーが作成されてしまうので ポイ…