Challenge 1 — Solution Task: Define an interface Speaker with a method Speak() string. Define two structs, Dog and Cat, each with a Speak() method returning an appropriate sound. Write a function announce(s Speaker) that prints the result of Speak(), and call it with both a Dog and a Cat. package main import "fmt" type Speaker interface { Speak() string } type Dog struct{} func (d Dog) Speak() string { return "Woof!" } type Cat struct{} func (c Cat) Speak() string { return "Meow!" } func announce(s Speaker) { fmt.Println(s.Speak()) } func main() { announce(Dog{}) announce(Cat{}) } Expected output: Woof! Meow! Notes: - Dog and Cat never mention Speaker anywhere in their definitions — they satisfy it automatically just by having a matching Speak() string method. - struct{} (empty braces, no fields) is valid when a type doesn't need to store any data — Dog and Cat exist here purely to provide behaviour via Speak(). - announce works identically for both types because it only ever calls s.Speak(), never anything specific to Dog or Cat.