Interfaces let you define a set of actions that different things can do. This helps you write flexible and reusable code.
Implementing interfaces in Go
type InterfaceName interface { MethodName1(paramType) returnType MethodName2(paramType) returnType } // To implement the interface, a type must have all methods with matching signatures func (t TypeName) MethodName1(paramType) returnType { // method body } func (t TypeName) MethodName2(paramType) returnType { // method body }
In Go, you don't explicitly say a type implements an interface. It happens automatically if the type has all the methods.
Interfaces describe behavior, not data.
Speaker with one method Speak. The type Dog implements it by defining Speak.type Speaker interface { Speak() string } type Dog struct {} func (d Dog) Speak() string { return "Woof!" }
type Reader interface { Read(p []byte) (n int, err error) } // Any type with Read method matching this signature implements Reader interface.
This program defines an interface Greeter with one method Greet. The type Person implements it. The function sayHello accepts any Greeter and calls Greet. In main, we create a Person and pass it to sayHello.
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, my name is " + p.name } // Function that accepts any Greeter func sayHello(g Greeter) { fmt.Println(g.Greet()) } func main() { p := Person{name: "Alice"} sayHello(p) }
You don't need to write extra code to say a type implements an interface; Go figures it out automatically.
If a type misses even one method from the interface, it does not implement it.
Interfaces help you write code that works with many types, making your programs more flexible.
Interfaces define a set of methods that types can implement.
Types implement interfaces by having all the required methods.
This allows writing flexible and reusable code that works with different types.
Practice
Solution
Step 1: Understand interface implementation in Go
In Go, a type implements an interface by having all the methods the interface declares.Step 2: Compare options with Go's rules
Go does not use inheritance or explicit declarations for interfaces; it uses method sets.Final Answer:
The type has all the methods declared in the interface. -> Option DQuick Check:
Interface implementation = method set match [OK]
- Thinking Go uses inheritance for interfaces
- Believing explicit declaration is needed
- Confusing interfaces with structs
Solution
Step 1: Recall Go interface implementation syntax
Go does not require explicit declarations; a type implements an interface by having all its methods.Step 2: Analyze each option
Options A, B, and D show invalid or non-Go syntax; only C correctly states Go's implicit implementation.Final Answer:
No explicit declaration needed; implement all interface methods -> Option CQuick Check:
Implicit implementation = No explicit declaration needed; implement all interface methods [OK]
- Trying to declare implementation explicitly
- Using inheritance syntax from other languages
- Adding interface as a struct field
package main
import "fmt"
type Speaker interface {
Speak() string
}
type Dog struct {}
func (d Dog) Speak() string {
return "Woof!"
}
func saySomething(s Speaker) {
fmt.Println(s.Speak())
}
func main() {
var d Dog
saySomething(d)
}Solution
Step 1: Check if Dog implements Speaker
Dog has a method Speak() string, so it implements Speaker interface.Step 2: Trace the function call saySomething(d)
saySomething calls s.Speak(), which returns "Woof!" and prints it.Final Answer:
Woof! -> Option AQuick Check:
Interface method call prints "Woof!" [OK]
- Assuming explicit declaration is needed
- Confusing method receiver types
- Expecting runtime errors without reason
package main
import "fmt"
type Runner interface {
Run()
}
type Person struct {}
func (p *Person) Run() {
fmt.Println("Running")
}
func main() {
var r Runner
p := Person{}
r = p
r.Run()
}Solution
Step 1: Check method receiver type
Run() is defined with pointer receiver (*Person), so only *Person implements Runner.Step 2: Analyze assignment r = p
Variable p is a Person value, not *Person pointer, so it does not implement Runner.Final Answer:
Cannot assign Person value to Runner interface because Run() has pointer receiver -> Option BQuick Check:
Pointer receiver method requires pointer type [OK]
- Ignoring pointer vs value receiver difference
- Assuming interface methods must return values
- Thinking interface assignment always works
type Reader interface {
Read() string
}
type Writer interface {
Write(string)
}
type ReadWriter interface {
Reader
Writer
}
type File struct {}
func (f *File) Read() string {
return "data"
}
func (f *File) Write(s string) {
// write data
}
func main() {
var rw ReadWriter
var f File
// Which assignment is valid?
}Solution
Step 1: Check if File implements ReadWriter
File has Read() and Write(string) with pointer receivers (*File), so only *File implements ReadWriter; File value does not.Step 2: Analyze assignment options
rw = &f is valid (&f is *File). rw = f fails (File doesn't implement). C invalid. rw = nil compiles but doesn't hold usable ReadWriter.Final Answer:
rw = &f -> Option AQuick Check:
Pointer receiver requires pointer type [OK]
- Thinking value type implements pointer receiver interface
- Assigning nil to interface without initialization
- Confusing interface embedding with inheritance
Ready to prove it?
Pass the test and this pattern moves unknown
