Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

Kullanmak istediğiniz bir seçeneğin hata verebileceği durumlar olacaktır. İadeye bağlı olarak, işlemi ya devam ettirirsiniz ya da sonlandırırsınız. Bu basit örnek, Golang'daki işlevsel seçeneklerden kaynaklanan hataları gidermenize yardımcı olacaktır.


car.go


package car

import "fmt"

type option func() (func(*Car), error)

func success(opt func(*Car)) option {
return func() (func(*Car), error) {
return opt, nil
}
}

func failure(err error) option {
return func() (func(*Car), error) {
return nil, err
}
}

type Car struct {
make string
model string
}

func New(options ...option) (*Car, error) {
car := &Car{}

for _, option := range options {
opt, err := option()
if err != nil {
return nil, err
}

opt(car)
}

return car, nil
}

func WithMake(val string) option {
if val == "ford" {
return failure(fmt.Errorf("make: we do not produce %s", val))
}

return success(func(c *Car) {
c.make = val
})
}

func WithModel(val string) option {
return success(func(c *Car) {
c.model = val
})
}

Test


package main

import (
"log"

"practise/car"
)

func main() {
// Without any options.
car1, err := car.New()
if err != nil {
log.Fatalln(err)
}
log.Printf("%+v\n", car1)

// With valid options.
car2, err := car.New(car.WithMake("bmw"), car.WithModel("m3"))
if err != nil {
log.Fatalln(err)
}
log.Printf("%+v\n", car2)

// With valid options.
car3, err := car.New(car.WithMake("ford"), car.WithModel("mustang"))
if err != nil {
log.Fatalln(err)
}
log.Printf("%+v\n", car3)
}

$ go run .
2020/06/09 00:00:08 &{make: model:}
2020/06/09 00:00:08 &{make:bmw model:m3}
2020/06/09 00:00:08 make: we do not produce ford
exit status 1