empty_interface.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. func main() {
  7. foo1()
  8. }
  9. type Payer interface {
  10. Pay(int) error
  11. }
  12. type Stringer interface {
  13. String() string
  14. }
  15. type Wallet struct {
  16. Cash int
  17. }
  18. func (w *Wallet) Pay(amount int) error {
  19. if w.Cash < amount {
  20. return fmt.Errorf("Не хватает денег на кошельке")
  21. }
  22. w.Cash -= amount
  23. return nil
  24. }
  25. func (w *Wallet) String() string {
  26. return "Кошелек в котором " + strconv.Itoa(w.Cash) + " денег"
  27. }
  28. func Buy(in interface{}) {
  29. var p Payer
  30. var ok bool
  31. if p, ok = in.(Payer); !ok {
  32. fmt.Printf("%T не является платежным интерфейсом\n\n", in)
  33. return
  34. }
  35. err := p.Pay(10)
  36. if err != nil {
  37. fmt.Printf("Ошибка при оплате %T: %v\n\n", p, err)
  38. return
  39. }
  40. fmt.Printf("Спасибо за покупку через %T\n\n", p)
  41. }
  42. func foo1() {
  43. myWallet := &Wallet{Cash: 100}
  44. // fmt.Printf("Raw payment : %#v\n", myWallet)
  45. // fmt.Printf("Способ оплаты: %s\n", myWallet)
  46. Buy(myWallet)
  47. Buy([]int{1, 2, 3})
  48. Buy(3.14)
  49. }