Open5

Goを学ぶ(実践)

Yuki hatamotoYuki hatamoto

ディレクトリをモジュールにする

$ go mod init github.com/name/reponame
Yuki hatamotoYuki hatamoto

サーバー

ハンドラ
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 {}
Yuki hatamotoYuki hatamoto

構造体とjson

go構造体

type A struct{
    hoge int
    moge string
}

jsonについて
https://datamix.co.jp/media/datascience/introduction-to-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)
Yuki hatamotoYuki hatamoto

データベースの扱い

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)