Goの勉強録
go言語を身に付けたいと思って頑張って色々するものの、環境構築とHello Worldをhtmlで表示して「やったー」と思ったまま放置していました。
他に色々忙しいのと、PHPでWebソフト作っていてgoでやる必要性とかを色々考えててモチベが上がらずってのも結構原因でした。
そこで勉強録をつけていけば自分の技術の軌跡がわかるしモチベ向上になるんじゃね?と思って勉強録をつけようと思います。
余談
PHPで開発していた時にMySQLが起動しなくなって初期化からインストールをする際に
/usr/local/Cellar/
のなかで,sudo rm -rf *
をしてしまったので,brewから導入した環境が全て飛びました。/(^o^)\ナンテコッタイ
そのおかげで、goの環境構築を一からしました。
ちなみにgoの環境構築はGo言語の環境構築 Hello Worldまでに記録してます。
本題
余談はここまでにしておいて,実際にgoで静的ページを生成します。
静的ページとは、誰が閲覧しても内容が変わらないページって事ですね。つまり文書だけしかないページや画像しかないページを思い浮かべて貰えると分かりやすいです。
今回はgoのなかでが他のhtmlファイルを読み込んでそれをローカルホストに表示するってことをやります。
GOPATH
は~/go/
に通している前提で話を進めます。
以下のコマンドで今回のワークスペースを作成
mkdir ~/go/StaticPage/ ~/go/StaticPage/HTML && cd ~/go/StaticPage/
touch main.go ./HTML/index.html
まず、表示用のhtmlを作成
<!DOCTYPE html>
<html>
<body>
<h1>It Works!</h1>
</body>
</html>
次に、htmlを呼び出すプログラムを書きます。
package main
import (
"fmt"
"log"
"net/http"
"os"
"reflect"
)
func main() {
// このファイルのパスを取得
dir, _ := os.Getwd()
// データ型を取得
fmt.Println(reflect.TypeOf(dir))
// 第一引数 (/staticpage/) ハンドラの生成
// 第二引数 (/staticpage/) のリンクの中にhtmlファイルを探す設定
// 第三引数 // .htmlを配置したディレクトリ (dir+"/HTML/") を読み込む
http.Handle("/staticpage/", http.StripPrefix("/staticpage/", http.FileServer(http.Dir(dir+"/HTML/"))))
// ListenAndServe でたちあげれなかった場合のlog
// nilでhttp.Handleで設定したハンドラーを呼び込み
log.Fatal(http.ListenAndServe(":8080", nil))
}
ずっとエラーで
./main.go:18:85: cannot use string(dir) (type string) as type http.FileSystem in argument to http.FileServer:
string does not implement http.FileSystem (missing Open method)
って言われていてデータ型のエラーだと思ってreflect
をimportしたTypeOf
で引数のデータ型が知れることがわかった。
今後デバッグの際に使うかも
結局、http.Dir()が第三引数の呼び出す関数の引数に書き忘れていただけだった/(^o^)\ヨクアル!
ここまできたらあとは実行するだけ
bash:bash
go run main.go
ブラウザでhttp://localhost:8080/staticpage/
を検索するとIt Works!
と表示される。http.Handle
とhttpHandler
の違いがイマイチなので今度ぶち当たったらそれも記事としてあげます。
参考
https://liginc.co.jp/333868
http://y0m0r.hateblo.jp/entry/20140413/1397397593