Bu örnekte, programcıları belirli bir arabirim üzerine kurulu bir yapıyı argüman olarak kullanmaya zorlayacağız. Bu argüman bir kurucuda kullanılacak, ancak bir fonksiyon veya metod ile de kullanılabilir. Bunu yapmamızın nedeni, paketimizin belirli bir yapı türüyle çalışabilmesidir. Yapı alanları ve işlevsellik, arayüzü tatmin ettiği sürece herhangi bir şey olabilir.


Örneğimiz basit. Seçici bir sürücümüz var ve bu sürücü sadece "A" sınıfı araba sürmeyi seviyor. Yine de ona her şeyi vereceğiz!


Yapı


├── car
│   ├── audi.go
│   └── mercedes.go
├── driver
│   ├── car.go
│   └── driver.go
└── main.go

Dosyalar


car.go


package driver

type Car interface {
CheckClass(requiredClass string) bool
Make() string
Model() string
}

driver.go


package driver

import "log"

type Driver struct {
name string
requiredClass string
cars []Car
}

func New(name, requiredClass string, car... Car) Driver {
return Driver{
name: name,
requiredClass: requiredClass,
cars: car,
}
}

func (d Driver) Drive() {
for _, car := range d.cars {
if car.CheckClass(d.requiredClass) {
log.Println(d.name, "will drive", car.Make(), car.Model())
} else {
log.Println(d.name, "won't drive", car.Make(), car.Model())
}
}
}

audi.go


package car

type Audi struct {
// Class
Cls string
// Model
Mdl string
}

func (c Audi) CheckClass(requiredClass string) bool {
return c.Cls == requiredClass
}

func (c Audi) Make() string {
return "Audi"
}

func (c Audi) Model() string {
return c.Mdl
}

mercedes.go


package car

type Mercedes struct {
// Class
Cls string
// Model
Mdl string
}

func (c Mercedes) CheckClass(requiredClass string) bool {
return c.Cls == requiredClass
}

func (c Mercedes) Make() string {
return "Mercedes"
}

func (c Mercedes) Model() string {
return c.Mdl
}

main.go


package main

import (
"client/internal/car"
"client/internal/driver"
)

func main() {
merc1 := car.Mercedes{
Cls: "A",
Mdl: "SL500",
}
merc2 := car.Mercedes{
Cls: "C",
Mdl: "D200",
}
audi1 := car.Audi{
Cls: "A",
Mdl: "80",
}

driver.
New("inanzzz", "A", merc1, merc2, audi1).
Drive()
}

Test


2020/04/06 18:01:54 inanzzz will drive Mercedes SL500
2020/04/06 18:01:54 inanzzz won't drive Mercedes D200
2020/04/06 18:01:54 inanzzz will drive Audi 80