Bird
Raised Fist0
Goprogramming~5 mins

Interface use cases in Go

Choose your learning style10 modes available
Introduction

Interfaces let us write flexible code that works with different types. They help us organize and reuse code easily.

When you want different types to share common behavior without sharing code.
When you want to write functions that can accept many different types.
When you want to hide details and only expose what is needed.
When you want to make your code easier to test by using mock implementations.
When you want to design plugins or modules that can be swapped easily.
Syntax
Go
type InterfaceName interface {
    MethodName(params) returnType
}

An interface lists method signatures without implementations.

Any type that has those methods automatically implements the interface.

Examples
This interface requires a Speak method that returns a string.
Go
type Speaker interface {
    Speak() string
}
This interface matches types that can read bytes into a slice.
Go
type Reader interface {
    Read(p []byte) (n int, err error)
}
This interface requires a Log method that takes a message string.
Go
type Logger interface {
    Log(message string)
}
Sample Program

This program shows two types, Person and Robot, both implementing the Greeter interface by having a Greet method. The sayHello function accepts any Greeter and calls Greet. This lets us use different types interchangeably.

Go
package main

import "fmt"

// Define an interface
 type Greeter interface {
    Greet() string
}

// Define a type that implements Greeter
 type Person struct {
    name string
}

func (p Person) Greet() string {
    return "Hello, " + p.name
}

// Define another type that implements Greeter
 type Robot struct {
    id int
}

func (r Robot) Greet() string {
    return fmt.Sprintf("Beep boop, I am robot #%d", r.id)
}

// Function that accepts any Greeter
 func sayHello(g Greeter) {
    fmt.Println(g.Greet())
}

func main() {
    p := Person{name: "Alice"}
    r := Robot{id: 42}

    sayHello(p) // Person greets
    sayHello(r) // Robot greets
}
OutputSuccess
Important Notes

Interfaces are satisfied implicitly in Go; you don't need to declare it explicitly.

Use interfaces to write flexible and testable code.

Empty interface interface{} can hold any type but should be used carefully.

Summary

Interfaces define behavior by listing method signatures.

Any type with those methods implements the interface automatically.

Interfaces let you write flexible, reusable, and testable code.

Practice

(1/5)
1. What is the main purpose of an interface in Go?
easy
A. To define a set of method signatures that a type must implement
B. To store data values of different types
C. To create a new data type with fields
D. To perform arithmetic operations

Solution

  1. Step 1: Understand what an interface represents

    An interface in Go lists method signatures without implementations.
  2. Step 2: Identify the role of interfaces

    Any type that implements those methods satisfies the interface, enabling flexible code.
  3. Final Answer:

    To define a set of method signatures that a type must implement -> Option A
  4. Quick Check:

    Interface = method signatures [OK]
Hint: Interfaces list methods, not data or operations [OK]
Common Mistakes:
  • Confusing interfaces with structs
  • Thinking interfaces hold data
  • Assuming interfaces perform calculations
2. Which of the following is the correct way to declare an interface named Speaker with a method Speak() in Go?
easy
A. func Speaker() interface { Speak() }
B. interface Speaker { func Speak() }
C. type Speaker struct { Speak() }
D. type Speaker interface { Speak() }

Solution

  1. Step 1: Recall Go interface syntax

    Interfaces are declared with type Name interface { methods }.
  2. Step 2: Match the correct syntax

    type Speaker interface { Speak() } correctly declares Speaker as an interface with method Speak().
  3. Final Answer:

    type Speaker interface { Speak() } -> Option D
  4. Quick Check:

    Interface declaration = type Speaker interface { Speak() } [OK]
Hint: Use 'type Name interface { ... }' to declare interfaces [OK]
Common Mistakes:
  • Using 'interface' keyword alone without 'type'
  • Declaring interfaces as structs
  • Adding 'func' keyword inside interface methods
3. What will be the output of the following Go code?
package main
import "fmt"
type Speaker interface {
  Speak()
}
type Dog struct {}
func (d Dog) Speak() {
  fmt.Println("Woof!")
}
func saySomething(s Speaker) {
  s.Speak()
}
func main() {
  d := Dog{}
  saySomething(d)
}
medium
A. Woof!
B. Compilation error
C. Runtime panic
D. No output

Solution

  1. Step 1: Check if Dog implements Speaker

    Dog has method Speak(), so it satisfies Speaker interface.
  2. Step 2: Trace function call

    In main, saySomething(d) calls d.Speak(), printing "Woof!".
  3. Final Answer:

    Woof! -> Option A
  4. Quick Check:

    Interface method call prints "Woof!" [OK]
Hint: Check if type has all interface methods to predict output [OK]
Common Mistakes:
  • Assuming interface needs explicit implementation declaration
  • Expecting compilation error due to interface
  • Missing method receiver syntax
4. Identify the error in this Go code snippet using interfaces:
package main
import "fmt"
type Reader interface {
  Read()
}
type File struct {}
func (f *File) Read() {
  fmt.Println("Reading file")
}
func main() {
  var r Reader
  f := File{}
  r = f
  r.Read()
}
medium
A. Interface Reader cannot have methods
B. Method Read() must return a value
C. Cannot assign value of type File to Reader interface
D. No error, code runs fine

Solution

  1. Step 1: Check method receiver type

    Read() is defined on pointer receiver *File, not on File value.
  2. Step 2: Understand interface assignment rules

    Assigning f (value) to interface r fails because File does not implement Read(), only *File does.
  3. Final Answer:

    Cannot assign value of type File to Reader interface -> Option C
  4. Quick Check:

    Pointer receiver methods require pointer type assignment [OK]
Hint: Pointer receiver methods need pointer type to satisfy interfaces [OK]
Common Mistakes:
  • Ignoring pointer vs value receiver difference
  • Expecting interface to accept any type
  • Thinking methods must return values
5. Given these types and interfaces:
type Walker interface {
  Walk()
}
type Runner interface {
  Run()
}
type Athlete interface {
  Walker
  Runner
}
type Person struct {}
func (p Person) Walk() {
  fmt.Println("Walking")
}
func (p Person) Run() {
  fmt.Println("Running")
}

Which of the following statements is true?
hard
A. Person must explicitly declare it implements Athlete
B. Person implements Athlete because it has both Walk and Run methods
C. Athlete interface cannot embed other interfaces
D. Person only implements Walker, not Athlete

Solution

  1. Step 1: Understand interface embedding

    Athlete embeds Walker and Runner, so it requires both Walk() and Run() methods.
  2. Step 2: Check Person methods

    Person has both Walk() and Run() methods, so it satisfies Athlete interface automatically.
  3. Final Answer:

    Person implements Athlete because it has both Walk and Run methods -> Option B
  4. Quick Check:

    Interface embedding means combined methods [OK]
Hint: Embedded interfaces combine methods; implement all to satisfy [OK]
Common Mistakes:
  • Thinking explicit declaration is needed
  • Believing interface embedding is invalid
  • Assuming partial method implementation suffices
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