0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Go言語】バックエンド開発の基本 - WebAPI/DB操作/JSONハンドリング学習メモ

Posted at

Goでのバックエンド開発学習記録 - WebAPI、DB操作、JSONハンドリング編

こんにちは!フリーランスエンジニアのこたろうです。

普段はバックエンド開発を中心に活動しています。今回は自身の学習記録として、Go言語でのバックエンド開発について学んだことをまとめてみました。WebAPI、データベース操作、JSONハンドリングなど、基本的な実装方法を解説していきます。

目次

  1. Web APIの基礎
  2. JSONの取り扱い
  3. データベース操作
  4. トランザクションとテスト

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の取り扱いなど、実践的な知識を整理しています。

参考文献


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?