Understanding Encapsulation in Go

Go, although not a traditional Object-Oriented Programming (OOP) language, provides encapsulation through the use of structs and package-level visibility. Encapsulation in Go is about controlling access to data and methods within packages, enabling you to create robust and maintainable applications.

To illustrate, consider a Go struct representing a bank account. Without encapsulation, the account balance could be directly altered. With encapsulation, however, the balance can only change through specific methods, like depositing or withdrawing.

Encapsulation: Managing Data Privacy with Visibility

In Go, data privacy is managed through the visibility of identifiers. By convention, identifiers starting with a lowercase letter are unexported and accessible only within the same package. In contrast, identifiers that begin with an uppercase letter are exported and accessible from other packages.

For example, let's consider a Go struct named Person, which includes an unexported field name.

person/person.go

main.go

Exported Methods for Controlled Access

In Go, encapsulation utilizes exported methods on structs to access or modify the unexported fields. Let's illustrate this through a simple example.

dog/dog.go

main.go

The Go Way: Simplicity in Encapsulation

In Go, it's idiomatic to use the exported field name as the getter method name (e.g., method Owner for field owner), while setters can be named with a Set prefix. The Go approach emphasizes simplicity, with public fields for straightforward data types and setters/getters for types used as part of an abstraction. Use concrete types until abstraction becomes necessary.

In summary, here are scenarios where getters and setters are appropriate:

  • Validation or Business Logic: Use setters when a field assignment involves validation or extra logic.
  • Encapsulation: Use getters to reveal a field's value while preventing direct alterations.
  • Computed Properties: Use getters to calculate a value dynamically from other fields.
Practical Application

Let's apply encapsulation principles to our BankAccount struct, which includes unexported attributes like an account number and balance, alongside exported methods for withdrawals, deposits, and balance checks.

bank/bank.go

main.go

In this example, the BankAccount struct encapsulates account details, with methods manipulating the balance in a controlled manner, enhancing security.

Summary and Practice

Now, it's your turn to apply encapsulation in Go. Create structs with unexported fields and develop exported methods to control access and modifications. This hands-on practice will deepen your understanding of encapsulation concepts. Happy coding!

Sign up
Join the 1M+ learners on CodeSignal
Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal