Open5
Goを学ぶ(実践)
基礎を学んだのでこちらを元に実際にAPIなどを作って学ぶ
ディレクトリをモジュールにする
$ go mod init github.com/name/reponame
サーバー
ハンドラ
httpのリクエストを受け取り, httpレスポンスを書き込む関数
handler:=func(w http.ResponseWriter, req *http.Request){}
reqからリクエストの中身を受け取り, wに書き込む流れ
handleFunc関数によってサーバーがハンドラを利用するようになる
サーバー起動(errorを返り値に持つ)
func ListenAndServe(addr string, handler Handler) error
httpエラー
レスポンスコードは定数で定義されている
func Error(w ResponseWriter, error string, code int)
クエリキー
存在すればokにtrueが入る
queryMap:=req.URL.Query()
if p, ok := queryMap["key"]; ok {}
構造体とjson
go構造体
type A struct{
hoge int
moge string
}
jsonについて
jsonにエンコード
go構造体のフィールドがjsonのキーとしてエンコードされる
実際はgo構造体はキャメルケース, jsonはスネークケースを使いたいので以下のようにする
type A struct {
HogeHoge string `json:"hoge_hoge"`
ストリームとしてエンコード/デコード
// reqからデコード
var structData GoStruct
if err := json.NewDecoder(req.Body).Decode(&structData); err != nil {}
// エンコードしてhttp.ResponseWriterに書き込む
json.NewEncoder(w).Encode(structData)
データベースの扱い
select
const sqlStr = `select hoge from moge where id = ?;`
rows,err := db.Query(sqlStr, id) //第二引数以降にクエリの変数を書く
defer rows.Close()
rowsから構造体に読み出す
goStructArray := make([]GoStruct,0)
for rows.Next() { //読み出し終了or読み出し失敗でfalseを返す
var goStruct GoStruct
err := rows.Scan(&field1,&field2...) //ポインタで指定
if err != nil{
//err
} else {
goStructArraly = append(goStructArray, goStruct)
}
}
データの挿入
goStruct := GoStruct{field1: value1, field2: value2}
const sqlStr =`insert into moge (field1,field2) values (?, ?);`
result, err := db.Exec(sqlStr, goStruct.field1, goStruct.field2)