Interfaces describe behavior by listing methods.

interface An interface is satisfied by any type that has the required methods.

Interface Basics

name
interface_intro.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

type Speaker interface {
	Speak() string
}

type Person struct {
	Name string
}

func (p Person) Speak() string {
	return "hello from " + p.Name
}

func main() {
	var name = "Ada"
	var speaker Speaker = Person{Name: name}
	message := speaker.Speak()

	fmt.Println("name=", name)
	fmt.Println("message=", message)
}
package main

import "fmt"

type Speaker interface {
	Speak() string
}

type Person struct {
	Name string
}

func (p Person) Speak() string {
	return "hello from " + p.Name
}

func main() {
	var name = "Matz"
	var speaker Speaker = Person{Name: name}
	message := speaker.Speak()

	fmt.Println("name=", name)
	fmt.Println("message=", message)
}
package main

import "fmt"

type Speaker interface {
	Speak() string
}

type Person struct {
	Name string
}

func (p Person) Speak() string {
	return "hello from " + p.Name
}

func main() {
	var name = "Grace"
	var speaker Speaker = Person{Name: name}
	message := speaker.Speak()

	fmt.Println("name=", name)
	fmt.Println("message=", message)
}
  1. name ← "Ada", speaker ← main.Person{Name:"Ada"}

    17func main() {18  var name→ "Ada" = "Ada" //@name="Matz", "Grace"19  var speaker→ main.Person{Name:"Ada"} Speaker = Person{Name: name→ "Ada"}20  message := speakermain.Person{Name:"Ada"}.Speak()
  2. func (p Person) Speak() string

    13func (p Person) Speak() string {14  return "hello from " + p.Name"Ada"15}
  3. message ← "hello from Ada"

    19  var speaker Speaker = Person{Name: name}20  message→ "hello from Ada" := speakermain.Person{Name:"Ada"}.Speak()2122  fmt.Println("name=", name"Ada")23  fmt.Println("message=", message"hello from Ada")24}
    outputname= Ada
    message= hello from Ada
  1. name ← "Matz", speaker ← main.Person{Name:"Matz"}

    17func main() {18  var name→ "Matz" = "Matz"19  var speaker→ main.Person{Name:"Matz"} Speaker = Person{Name: name→ "Matz"}20  message := speakermain.Person{Name:"Matz"}.Speak()
  2. func (p Person) Speak() string

    13func (p Person) Speak() string {14  return "hello from " + p.Name"Matz"15}
  3. message ← "hello from Matz"

    19  var speaker Speaker = Person{Name: name}20  message→ "hello from Matz" := speakermain.Person{Name:"Matz"}.Speak()2122  fmt.Println("name=", name"Matz")23  fmt.Println("message=", message"hello from Matz")24}
    outputname= Matz
    message= hello from Matz
  1. name ← "Grace", speaker ← main.Person{Name:"Grace"}

    17func main() {18  var name→ "Grace" = "Grace"19  var speaker→ main.Person{Name:"Grace"} Speaker = Person{Name: name→ "Grace"}20  message := speakermain.Person{Name:"Grace"}.Speak()
  2. func (p Person) Speak() string

    13func (p Person) Speak() string {14  return "hello from " + p.Name"Grace"15}
  3. message ← "hello from Grace"

    19  var speaker Speaker = Person{Name: name}20  message→ "hello from Grace" := speakermain.Person{Name:"Grace"}.Speak()2122  fmt.Println("name=", name"Grace")23  fmt.Println("message=", message"hello from Grace")24}
    outputname= Grace
    message= hello from Grace