Bank Account
Bank Account

Bank Account



Simulate a bank account supporting opening/closing, withdrawals, and deposits of money. Watch out for concurrent transactions!

A bank account can be accessed in multiple ways. Clients can make deposits and withdrawals using the internet, mobile phones, etc. Shops can charge against the account.

Create an account that can be accessed from multiple threads/processes (terminology depends on your programming language).

It should be possible to close an account; operations against a closed account must fail.


Run the test file, and fix each of the errors in turn. When you get the first test to pass, go to the first pending or skipped test, and make that pass as well. When all of the tests are passing, feel free to submit.

Remember that passing code is just the first step. The goal is to work towards a solution that is as readable and expressive as you can make it.

Have fun!

Implementation Notes

Opening an account

An account can be opened. On opening, its initial balance should not be negative. If a negative balance is given to the Open function, nil must be returned, otherwise the newly created account must be returned.

Closing an account

An account can be closed. When closing an account, the Close method must return the balance the account has and a boolean true indicating the account was closed successfully. Closing an account does not succeed if the account is already closed. When an account is closed, its balance must be set to 0.

Getting the account balance

The Balance method allows a user to check the current balance of an account. It must return the balance of the account and a boolean indicating if the operation succeeded. Checking the balance only doesn't succeed if the account is closed.

Deposits / Withrawals

Deposits and withdrawals are both handled by the Deposit method. If the argument given to the method is a positive amount, then that amount of money must be deposited in the account. If the amount given is negative, that amount of money must be withdrawn from the account. If the account is closed, its balance must not be modified.

Deposit returns the new balance of the account and a boolean that indicates if the operation succeeded. Deposit must fail if the account is closed or if there is not enough money to withdraw from the account.


The tests will execute some operations concurrently. You should strive to ensure that operations on the Account leave it in a consistent state. For example: multiple goroutines may be depositing and withdrawing money simultaneously, two withdrawals occurring concurrently should not be able to bring the balance into the negative.

When working locally, you can test that your code handles concurrency properly and does not introduce data races, run tests with -race flag on.

$ cd exercism/project/directory/go/bank-account
$ go test -race


If you are new to concurrent operations in Go it will be worth looking at the sync package, specifically Mutexes:

Last updated 31 May 2023
Edit via GitHub The link opens in a new window or tab
Go Exercism

Ready to start Bank Account?

Sign up to Exercism to learn and master Go with 34 concepts, 140 exercises, and real human mentoring, all for free.