Goでのバックエンド開発学習記録 - WebAPI、DB操作、JSONハンドリング編
こんにちは!フリーランスエンジニアのこたろうです。
普段はバックエンド開発を中心に活動しています。今回は自身の学習記録として、Go言語でのバックエンド開発について学んだことをまとめてみました。WebAPI、データベース操作、JSONハンドリングなど、基本的な実装方法を解説していきます。
目次
- Web APIの基礎
- JSONの取り扱い
- データベース操作
- トランザクションとテスト
1. Web APIの基礎
HTTPメソッドの制御
func handler(w http.ResponseWriter, r *http.Request) {
// 許可するメソッドを指定
if r.Method != http.MethodPost {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
// 処理
}
gorilla/muxを使用したルーティング
router := mux.NewRouter()
router.HandleFunc("/api/items/{id}", handler).Methods("GET")
パラメータ取得
// パスパラメータ
vars := mux.Vars(r)
id := vars["id"]
// クエリパラメータ
query := r.URL.Query()
name := query.Get("name")
2. JSONの取り扱い
構造体とJSONの変換
type Item struct {
ID int `json:"id"`
Name string `json:"name"`
}
// レスポンスとしてJSONを返す
json.NewEncoder(w).Encode(item)
// リクエストのJSONを構造体に変換
var item Item
json.NewDecoder(r.Body).Decode(&item)
デコーダ・エンコーダの活用
func readJSON(reader io.Reader, v interface{}) error {
decoder := json.NewDecoder(reader)
return decoder.Decode(v)
}
func writeJSON(writer io.Writer, v interface{}) error {
encoder := json.NewEncoder(writer)
return encoder.Encode(v)
}
3. データベース操作
基本的なDB操作
// DB接続
db, err := sql.Open("postgres", "connection_string")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// クエリの実行
rows, err := db.Query("SELECT id, name FROM items")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
// 結果の取得
for rows.Next() {
var item Item
err := rows.Scan(&item.ID, &item.Name)
if err != nil {
log.Fatal(err)
}
// 処理
}
NULLの取り扱い
type Item struct {
ID int
Description sql.NullString
}
クエリパラメータの使用
row := db.QueryRow("SELECT id, name FROM items WHERE id = $1", id)
var item Item
err := row.Scan(&item.ID, &item.Name)
更新処理
result, err := db.Exec("UPDATE items SET name = $1 WHERE id = $2", name, id)
if err != nil {
log.Fatal(err)
}
rowsAffected, _ := result.RowsAffected()
4. トランザクションとテスト
トランザクション処理
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
// トランザクション内の処理
_, err = tx.Exec("INSERT INTO items (name) VALUES ($1)", "新しいアイテム")
if err != nil {
tx.Rollback()
log.Fatal(err)
}
err = tx.Commit()
if err != nil {
log.Fatal(err)
}
ユニットテスト
func TestItemCreate(t *testing.T) {
// テストケースの準備
item := Item{Name: "テストアイテム"}
// テストの実行
result, err := createItem(item)
// 検証
if err != nil {
t.Errorf("期待しないエラー: %v", err)
}
if result.ID == 0 {
t.Error("IDが設定されていません")
}
}
まとめ
Goでのバックエンド開発における基本的な実装方法を紹介しました。WebAPI、データベース操作、JSONの取り扱いなど、実践的な知識を整理しています。
参考文献
- 『Goで作るはじめてのWebアプリケーション 改訂版』技術書典