Bird
Raised Fist0
Goprogramming~30 mins

Receiver types in Go - Mini Project: Build & Apply

Choose your learning style10 modes available
Understanding Receiver Types in Go
📖 Scenario: Imagine you are creating a simple program to manage a bank account. You want to add money and check the balance using methods attached to your account.
🎯 Goal: Build a Go program that defines a BankAccount struct and uses both pointer and value receiver methods to modify and read the account balance.
📋 What You'll Learn
Create a struct called BankAccount with a field balance of type float64
Write a method Deposit with a pointer receiver that adds an amount to the balance
Write a method Balance with a value receiver that returns the current balance
Create a main function to demonstrate using both methods
💡 Why This Matters
🌍 Real World
Managing bank accounts or any data where you need to update or read values using methods.
💼 Career
Understanding receiver types is essential for writing clear and efficient Go code, especially in backend development and systems programming.
Progress0 / 4 steps
1
Create the BankAccount struct
Create a struct called BankAccount with a field balance of type float64.
Go
Hint

Use the type keyword to define a struct and add a field named balance with type float64.

2
Add a Deposit method with pointer receiver
Add a method called Deposit with a pointer receiver (acc *BankAccount) that takes a parameter amount float64 and adds it to acc.balance.
Go
Hint

Use a pointer receiver so the method can change the original balance field.

3
Add a Balance method with value receiver
Add a method called Balance with a value receiver (acc BankAccount) that returns the current balance as float64.
Go
Hint

Use a value receiver because this method only reads data and does not modify it.

4
Use the methods in main and print the balance
In the main function, create a variable account of type BankAccount. Call Deposit(100.0) on account. Then print the result of account.Balance().
Go
Hint

Create the account variable, call Deposit with 100.0, then print account.Balance().

Practice

(1/5)
1. What is the main difference between a value receiver and a pointer receiver in Go methods?
easy
A. Value receivers are faster than pointer receivers in all cases.
B. Value receivers can only read data; pointer receivers can only write data.
C. Pointer receivers create a new copy of the data each time.
D. Value receivers get a copy of the data; pointer receivers get the original data to modify.

Solution

  1. Step 1: Understand receiver types

    Value receivers receive a copy of the original data, so changes inside the method do not affect the original.
  2. Step 2: Pointer receivers behavior

    Pointer receivers receive the address of the original data, allowing methods to modify the original value.
  3. Final Answer:

    Value receivers get a copy of the data; pointer receivers get the original data to modify. -> Option D
  4. Quick Check:

    Receiver type = copy vs original [OK]
Hint: Pointer receivers allow modifying original data, value receivers do not [OK]
Common Mistakes:
  • Thinking value receivers modify original data
  • Believing pointer receivers create copies
  • Assuming pointer receivers are always slower
2. Which of the following is the correct syntax to define a method with a pointer receiver for a struct Person?
easy
A. func (p Person) Greet() string { return "Hi" }
B. func (p *Person) Greet() string { return "Hi" }
C. func Greet(p *Person) string { return "Hi" }
D. func (p Person*) Greet() string { return "Hi" }

Solution

  1. Step 1: Identify pointer receiver syntax

    Pointer receivers use an asterisk before the type in the receiver: (p *Person).
  2. Step 2: Check method declaration format

    The method must be declared with receiver in parentheses before the method name.
  3. Final Answer:

    func (p *Person) Greet() string { return "Hi" } -> Option B
  4. Quick Check:

    Pointer receiver syntax = (p *Type) [OK]
Hint: Pointer receiver syntax uses * before type inside parentheses [OK]
Common Mistakes:
  • Missing parentheses around receiver
  • Placing * after variable name instead of type
  • Defining method without receiver
3. What will be the output of this Go program?
package main
import "fmt"
type Counter struct { count int }
func (c Counter) Increment() { c.count++ }
func (c *Counter) IncrementPtr() { c.count++ }
func main() {
  c := Counter{count: 5}
  c.Increment()
  fmt.Println(c.count)
  c.IncrementPtr()
  fmt.Println(c.count)
}
medium
A. 5 6
B. 5 5
C. 6 6
D. 6 7

Solution

  1. Step 1: Analyze Increment method with value receiver

    Increment uses a value receiver, so it works on a copy. The original count remains 5 after calling Increment.
  2. Step 2: Analyze IncrementPtr method with pointer receiver

    IncrementPtr uses a pointer receiver, so it modifies the original count from 5 to 6.
  3. Final Answer:

    5 6 -> Option A
  4. Quick Check:

    Value receiver no change, pointer receiver changes [OK]
Hint: Value receiver copies data; pointer receiver changes original [OK]
Common Mistakes:
  • Assuming value receiver changes original
  • Confusing method calls with pointer vs value receivers
  • Expecting both increments to change count
4. Identify the error in this Go code snippet:
type Rectangle struct { width, height int }
func (r Rectangle) Scale(factor int) {
  r.width = r.width * factor
  r.height = r.height * factor
}
func main() {
  rect := Rectangle{2, 3}
  rect.Scale(2)
  fmt.Println(rect.width, rect.height)
}
medium
A. The struct fields width and height must be pointers.
B. Scale method must return a new Rectangle instead of modifying fields.
C. Scale method should have a pointer receiver to modify Rectangle fields.
D. The Scale method should be defined outside the Rectangle type.

Solution

  1. Step 1: Check receiver type in Scale method

    Scale uses a value receiver, so it works on a copy and does not modify the original Rectangle.
  2. Step 2: Fix receiver to pointer to modify original

    Changing receiver to pointer (r *Rectangle) allows Scale to modify the original struct fields.
  3. Final Answer:

    Scale method should have a pointer receiver to modify Rectangle fields. -> Option C
  4. Quick Check:

    Modify struct fields = pointer receiver needed [OK]
Hint: Use pointer receiver to change struct fields inside methods [OK]
Common Mistakes:
  • Using value receiver expecting changes to persist
  • Trying to make struct fields pointers unnecessarily
  • Thinking methods must be outside struct
5. You want to create a Go method Reset for a struct Timer that sets its seconds field to zero. Which receiver type should you use and why?
hard
A. Use a pointer receiver because you need to modify the original Timer's seconds field.
B. Use a value receiver because it is simpler and does not modify the original.
C. Use a value receiver and return a new Timer with seconds zeroed.
D. Use a pointer receiver but do not modify any fields inside the method.

Solution

  1. Step 1: Understand the goal of Reset method

    Reset must change the Timer's seconds field to zero, modifying the original struct.
  2. Step 2: Choose receiver type to allow modification

    Pointer receiver is needed to modify the original Timer instance inside the method.
  3. Final Answer:

    Use a pointer receiver because you need to modify the original Timer's seconds field. -> Option A
  4. Quick Check:

    Modify original struct = pointer receiver [OK]
Hint: Modify original struct? Use pointer receiver [OK]
Common Mistakes:
  • Using value receiver expecting original to change
  • Returning new struct instead of modifying original
  • Using pointer receiver but not modifying fields
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard