Go のメソッド・インタフェース周り覚書き

Go にもだいぶ慣れてきたが、インタフェース周りがあやふやになる。 なのでひと目で理解できるように、ソースコードで覚書き(自分用)

package main

import "fmt"

type Profile struct {
    Name   string
    Age    int
    Height int
    Weight int
}

type Dog struct {
    Profile
}

type Person struct {
    Profile
}

type Animal interface {
    Eat()
    Run()
    Walk()
    Sleep()
}

func (dog Dog) Eat() {
    fmt.Println("mog-mog")
}

func (dog Dog) Run() {
    fmt.Println("Dash!!")
}

func (dog Dog) Walk() {
    fmt.Println("Peta-Peta")
}

func (dog Dog) Sleep() {
    fmt.Println("Zzz")
}

func (dog Dog) Bark() {
    fmt.Println("Wan-Wan!")
}

func (person Person) Eat() {
    fmt.Println("mog-mog")
}

func (person Person) Run() {
    fmt.Println("Dash!!")
}

func (person Person) Walk() {
    fmt.Println("Peta-Peta")
}

func (person Person) Sleep() {
    fmt.Println("Zzz")
}

func (person Person) Greet() {
    fmt.Println("Hello!!")
}

func RunAndWalk(animal Animal) {
    animal.Run()
    animal.Walk()
}

func EatAndSleep(animal Animal) {
    animal.Eat()
    animal.Sleep()
}

func NewDog(name string, age int, height int, weight int) Dog {
    return Dog{
        Profile{
            Name:   name,
            Age:    age,
            Height: height,
            Weight: weight,
        },
    }
}

func NewPerson(name string, age int, height int, weight int) Person {
    return Person{
        Profile{
            Name:   name,
            Age:    age,
            Height: height,
            Weight: weight,
        },
    }
}

func main() {
    pochi := NewDog("Pochi", 5, 70, 20)
    akira := NewPerson("Akira", 17, 171, 68)

    RunAndWalk(pochi)
    RunAndWalk(akira)
    EatAndSleep(pochi)
    EatAndSleep(akira)

    pochi.Bark()
    akira.Greet()
}