many.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // --------------
  6. type Wallet struct {
  7. Cash int
  8. }
  9. func (w *Wallet) Pay(amount int) error {
  10. if w.Cash < amount {
  11. return fmt.Errorf("Не хватает денег в кошельке")
  12. }
  13. w.Cash -= amount
  14. return nil
  15. }
  16. // --------------
  17. type Card struct {
  18. Balance int
  19. ValidUntil string
  20. Cardholder string
  21. CVV string
  22. Number string
  23. }
  24. func (c *Card) Pay(amount int) error {
  25. if c.Balance < amount {
  26. return fmt.Errorf("Не хватает денег на карте")
  27. }
  28. c.Balance -= amount
  29. return nil
  30. }
  31. // --------------
  32. type ApplePay struct {
  33. Money int
  34. AppleID string
  35. }
  36. func (a *ApplePay) Pay(amount int) error {
  37. if a.Money < amount {
  38. return fmt.Errorf("Не хватает денег на аккаунте")
  39. }
  40. a.Money -= amount
  41. return nil
  42. }
  43. // --------------
  44. type Payer interface {
  45. Pay(int) error
  46. }
  47. // --------------
  48. func Buy(p Payer) {
  49. err := p.Pay(10)
  50. if err != nil {
  51. fmt.Printf("Ошибка при оплате %T: %v\n\n", p, err)
  52. return
  53. }
  54. fmt.Printf("Спасибо за покупку через %T\n\n", p)
  55. }
  56. // --------------
  57. func main() {
  58. myWallet := &Wallet{Cash: 100}
  59. Buy(myWallet)
  60. var myMoney Payer
  61. myMoney = &Card{Balance: 100, Cardholder: "rvasily"}
  62. Buy(myMoney)
  63. myMoney = &ApplePay{Money: 9}
  64. Buy(myMoney)
  65. }