package main

import (
	"fmt"
)

type Animal interface {
	Speak() string
}

type Dog struct {
	Name string
}

func (d Dog) Speak() string {
	return fmt.Sprintf("Собака %s лает", d.Name)
}

type Cat struct {
	Name string
}

func (c Cat) Speak() string {
	return fmt.Sprintf("Кошка %s мяукает", c.Name)
}

// Функция, принимающая интерфейс Animal и вызывающая Speak
func MakeAnimalSpeak(a Animal) {
	fmt.Println(a.Speak())
}

func main() {
	var animal Animal
	fmt.Printf("Value %v, type %T\n", animal, animal)
	dog := &Dog{Name: "Шарик"}
	animal = dog
	// fmt.Println(animal.Speak())
	fmt.Printf("Value %v, type %T\n", animal, animal)
	if animal != nil {
		fmt.Println("animal is not nil")
	}
}
