| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package main
- import (
- "fmt"
- "strconv"
- )
- func main() {
- foo1()
- }
- type Payer interface {
- Pay(int) error
- }
- type Stringer interface {
- String() string
- }
- type Wallet struct {
- Cash int
- }
- func (w *Wallet) Pay(amount int) error {
- if w.Cash < amount {
- return fmt.Errorf("Не хватает денег на кошельке")
- }
- w.Cash -= amount
- return nil
- }
- func (w *Wallet) String() string {
- return "Кошелек в котором " + strconv.Itoa(w.Cash) + " денег"
- }
- func Buy(in interface{}) {
- var p Payer
- var ok bool
- if p, ok = in.(Payer); !ok {
- fmt.Printf("%T не является платежным интерфейсом\n\n", in)
- return
- }
- err := p.Pay(10)
- if err != nil {
- fmt.Printf("Ошибка при оплате %T: %v\n\n", p, err)
- return
- }
- fmt.Printf("Спасибо за покупку через %T\n\n", p)
- }
- func foo1() {
- myWallet := &Wallet{Cash: 100}
- // fmt.Printf("Raw payment : %#v\n", myWallet)
- // fmt.Printf("Способ оплаты: %s\n", myWallet)
- Buy(myWallet)
- Buy([]int{1, 2, 3})
- Buy(3.14)
- }
|