Goを使った銀行システムをハンズオン形式で学ぼう
#Go

はじめに

Go言語は、高速で効率的な並行処理を実現し、シンプルな構文で開発者に優しい言語として人気を博しています。この記事では、Go言語を使って銀行システムを作成する手順をハンズオン形式で解説します。また、コード例も提供するので、初心者でも理解しやすい内容となっています。

銀行システムの概要

銀行システムは、顧客の口座情報を管理し、入出金履歴を記録するシステムです。このシステムを作成するためには、口座情報や入出金履歴をデータベースに保存し、データベースから情報を取得する機能が必要です。Go言語を使えば、簡単にデータベースとのやりとりができるため、銀行システムの作成に向いています。

銀行システムの実装

銀行システムを実装するには、以下の手順が必要です。

  1. データベースの設計と作成
  2. データベースとの接続
  3. 口座情報の登録、更新、削除機能の実装
  4. 入出金履歴の登録機能の実装
  5. 口座情報と入出金履歴の参照機能の実装

以上の手順を順番に進めていくことで、銀行システムを実現することができます。Go言語を使えば、データベースの操作がシンプルになるため、実装も簡単に行えます。

データベースの設計と作成

データベースの設計は、銀行システムの要件に基づいて行います。ここでは、口座情報を管理するためのテーブルを作成する例を示します。

CREATE TABLE accounts (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  balance INT(11) NOT NULL,
  PRIMARY KEY (id)
);

データベースとの接続

Go言語では、データベースとの接続にdatabase/sqlパッケージを使用します。以下のようにして、MySQLとの接続を行います。

import (
  "database/sql"
  _ "github.com/go-sql-driver/mysql"
)

func ConnectDB() (*sql.DB, error) {
  db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/bank_system")
  if err != nil {
    return nil, err
  }

  return db, nil
}

口座情報の登録、更新、削除機能の実装

以下のコード例は、銀行システムの口座情報を管理する機能の一部になります。

type Account struct {
  id int64
  name string
  balance int64
}

func CreateAccount(db *sql.DB, account Account) (int64, error) {
  // Prepare statement for inserting data
  stmt, err := db.Prepare("INSERT INTO accounts(name, balance) VALUES(?,?)")
  if err != nil {
    return 0, err
  }
  defer stmt.Close()

  // Execute statement
  result, err := stmt.Exec(account.name, account.balance)
  if err != nil {
    return 0, err
  }

  // Get last inserted ID
  id, err := result.LastInsertId()
  if err != nil {
    return 0, err
  }

  return id, nil
}

func UpdateAccount(db *sql.DB, account Account) error {
  // Prepare statement for updating data
  stmt, err := db.Prepare("UPDATE accounts SET name=?, balance=? WHERE id=?")
  if err != nil {
    return err
  }
  defer stmt.Close()

  // Execute statement
  _, err = stmt.Exec(account.name, account.balance, account.id)
  if err != nil {
    return err
  }

  return nil
}

func DeleteAccount(db *sql.DB, id int64) error {
  // Prepare statement for deleting data
  stmt, err := db.Prepare("DELETE FROM accounts WHERE id=?")
  if err != nil {
    return err
  }
  defer stmt.Close()

  // Execute statement
  _, err = stmt.Exec(id)
  if err != nil {
    return err
  }

  return nil
}

入出金履歴の登録機能の実装

以下のコード例は、銀行システムの入出金履歴を管理する機能の一部になります。

type Transaction struct {
  id int64
  accountID int64
  amount int64
  date time.Time
}

func CreateTransaction(db *sql.DB, transaction Transaction) (int64, error) {
  // Prepare statement for inserting data
  stmt, err := db.Prepare("INSERT INTO transactions(account_id, amount, date) VALUES(?,?,?)")
  if err != nil {
    return 0, err
  }
  defer stmt.Close()

  // Execute statement
  result, err := stmt.Exec(transaction.accountID, transaction.amount, transaction.date)
  if err != nil {
    return 0, err
  }

  // Get last inserted ID
  id, err := result.LastInsertId()
  if err != nil {
    return 0, err
  }

  return id, nil
}

口座情報と入出金履歴の参照機能の実装

以下のコード例は、銀行システムの口座情報と入出金履歴を参照する機能の一部になります。

type AccountWithTransactions struct {
  id int64
  name string
  balance int64
  transactions []Transaction
}

func GetAccountWithTransactions(db *sql.DB, id int64) (AccountWithTransactions, error) {
  // Get account information
  var account Account
  err := db.QueryRow("SELECT id, name, balance FROM accounts WHERE id=?", id).Scan(&account.id, &account.name, &account.balance)
  if err != nil {
    return AccountWithTransactions{}, err
  }

  // Get transactions
  rows, err := db.Query("SELECT id, account_id, amount, date FROM transactions WHERE account_id=?", id)
  if err != nil {
    return AccountWithTransactions{}, err
  }
  defer rows.Close()

  var transactions []Transaction
  for rows.Next() {
    var transaction Transaction
    err := rows.Scan(&transaction.id, &transaction.accountID, &transaction.amount, &transaction.date)
    if err != nil {
      return AccountWithTransactions{}, err
    }

    transactions = append(transactions, transaction)
  }

  return AccountWithTransactions{id: account.id, name: account.name, balance: account.balance, transactions: transactions}, nil
}



まとめ

今回は、Go言語を使って銀行システムを作成する手順をハンズオン形式で解説しました。銀行システムを作成することで、データベースとのやりとりや、関数の実装方法を学ぶことができます。また、コード例も提供しているので、初心者でも実際に手を動かしながら学ぶことができます。Go言語に興味がある方は、ぜひ挑戦してみてください。