Структурная типизация с использованием встроенного типа - GO - PullRequest
0 голосов
/ 28 марта 2019

В приведенном ниже коде:

package main

import "fmt"

type People interface {
    sayHello()
    getDetails()
}

type Person struct {
    name        string
    age         int
    city, phone string
}

// A person method
func (p Person) sayhello() {
    fmt.Printf("Hi, I am %s, form %s\n", p.name, p.city)
}

// A person method
func (p Person) getDetails() {
    fmt.Printf("[Name: %s, Age: %d, City: %s, Phone: %s]\n", p.name, p.age, p.city, p.phone)
}

Person имеет структурно типизированный с People, потому что в нем реализовано поведение People

Для приведенного ниже кода:

type Speaker struct {
    Person     // type embedding for composition
    speaksOn   []string
    pastEvents []string
}

func main() {
    obj1 := Speaker{Person{"aa", 23, "ww", "234"}, []string{"aa", "bb"}, []string{"dd", "ee"}}
    obj2 := Speaker{Person{"aa", 23, "ww", "234"}, []string{"aa", "bb"}, []string{"dd", "ee"}}
    obj3 := Speaker{Person{"aa", 23, "ww", "234"}, []string{"aa", "bb"}, []string{"dd", "ee"}}
    peopleList := [...]People{obj1, obj2, obj3}
    obj1.getDetails() 
    obj1.sayhello()
}

Почему obj1.getDetails() разрешается?Это потому, что тип Speaker имеет встроенный тип Person, а тип Person структурно типизирован с типом интерфейса People?

...