Dmitry Telenkov 3 viikkoa sitten
vanhempi
commit
8227f3da1d

+ 54 - 0
courses/golang_web/1_data_type/embed_interface.go

@@ -0,0 +1,54 @@
+package main
+
+import (
+	"fmt"
+)
+
+type Phone struct {
+	Money   int
+	AppleID string
+}
+
+func (p *Phone) Pay(amount int) error {
+	if p.Money < amount {
+		return fmt.Errorf("Noe enough money on account")
+	}
+	p.Money -= amount
+	return nil
+}
+
+func (p *Phone) Ring(number string) error {
+	if number == "" {
+		return fmt.Errorf("Please, enter phone")
+	}
+	return nil
+}
+
+// ---------------
+
+type Payer interface {
+	Pay(int) error
+}
+
+type Ringer interface {
+	Ring(string) error
+}
+
+type NFCPhone interface {
+	Payer
+	Ringer
+}
+
+func PayForMetWithPhone(phone NFCPhone) {
+	err := phone.Pay(1)
+	if err != nil {
+		fmt.Printf("Ошибка при оплате %v\n\n", err)
+		return
+	}
+	fmt.Printf("Турникет открыт через %T\n\n", phone)
+}
+
+func main() {
+	myPhone := &Phone{Money: 9}
+	PayForMetWithPhone(myPhone)
+}

+ 102 - 0
courses/golang_web/1_data_type/empty.go

@@ -0,0 +1,102 @@
+package main
+
+import (
+	"fmt"
+	"strconv"
+)
+
+type Wallet struct {
+	Cash int
+}
+
+type Stringer interface {
+	String() string
+}
+
+func (w *Wallet) String() string {
+	return "Кошелек в котором " + strconv.Itoa(w.Cash) + " денег"
+}
+
+func (w *Wallet) Pay(amount int) error {
+	if w.Cash < amount {
+		return fmt.Errorf("Не хватает денег в кошельке")
+	}
+	w.Cash -= amount
+	return nil
+}
+
+// ------------------
+
+type Card struct {
+	Balance    int
+	ValidUntil string
+	CardHolder string
+	CVV        string
+	Number     string
+}
+
+func (c *Card) Pay(amount int) error {
+	if c.Balance < amount {
+		return fmt.Errorf("Не хватает денег на карте")
+	}
+	c.Balance -= amount
+	return nil
+}
+
+// ------------------
+
+type ApplePay struct {
+	Money   int
+	AppleID string
+}
+
+func (a *ApplePay) Pay(amount int) error {
+	if a.Money < amount {
+		return fmt.Errorf("Не хватает денег на аккаунте")
+	}
+	a.Money -= amount
+	return nil
+}
+
+// ------------------
+
+type Payer interface {
+	Pay(int) error
+}
+
+// ------------------
+
+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 main() {
+	/*
+		myWallet := &Wallet{Cash: 100}
+		Buy(myWallet)
+
+		var myMoney Payer
+		myMoney = &Card{Balance: 100, CardHolder: "rvasily"}
+		Buy(myMoney)
+
+		myMoney = &ApplePay{Money: 120}
+		Buy(myMoney)
+	*/
+
+	// Пустые интерфейсы
+	myWallet := &Wallet{Cash: 100}
+	fmt.Printf("Raw payment: %#v\n", myWallet)
+	fmt.Printf("Способ оплаты: %s\n", myWallet)
+}

+ 107 - 0
courses/golang_web/1_data_type/interface.go

@@ -0,0 +1,107 @@
+package main
+
+import (
+	"fmt"
+	"strconv"
+)
+
+type Wallet struct {
+	Cash int
+}
+
+type Stringer interface {
+	String() string
+}
+
+func (w *Wallet) String() string {
+	return "Кошелек в котором " + strconv.Itoa(w.Cash) + " денег"
+}
+
+func (w *Wallet) Pay(amount int) error {
+	if w.Cash < amount {
+		return fmt.Errorf("Не хватает денег в кошельке")
+	}
+	w.Cash -= amount
+	return nil
+}
+
+// ------------------
+
+type Card struct {
+	Balance    int
+	ValidUntil string
+	CardHolder string
+	CVV        string
+	Number     string
+}
+
+func (c *Card) Pay(amount int) error {
+	if c.Balance < amount {
+		return fmt.Errorf("Не хватает денег на карте")
+	}
+	c.Balance -= amount
+	return nil
+}
+
+// ------------------
+
+type ApplePay struct {
+	Money   int
+	AppleID string
+}
+
+func (a *ApplePay) Pay(amount int) error {
+	if a.Money < amount {
+		return fmt.Errorf("Не хватает денег на аккаунте")
+	}
+	a.Money -= amount
+	return nil
+}
+
+// ------------------
+
+type Payer interface {
+	Pay(int) error
+}
+
+// ------------------
+
+func Buy(p Payer) {
+	switch p.(type) {
+	case *Wallet:
+		fmt.Println("Оплата наличными?")
+	case *Card:
+		plasticCard, ok := p.(*Card)
+		if !ok {
+			fmt.Println("Не удалось преобразовать к типу *Card")
+		}
+		fmt.Println("Вставляйте карту,", plasticCard.CardHolder)
+	default:
+		fmt.Println("Что-то новое!")
+	}
+
+	err := p.Pay(10)
+	if err != nil {
+		panic(err)
+	}
+	fmt.Printf("Спасибо за покупку через %T\n\n", p)
+}
+
+func main() {
+	/*
+		myWallet := &Wallet{Cash: 100}
+		Buy(myWallet)
+
+		var myMoney Payer
+		myMoney = &Card{Balance: 100, CardHolder: "rvasily"}
+		Buy(myMoney)
+
+		myMoney = &ApplePay{Money: 120}
+		Buy(myMoney)
+	*/
+
+	// Пустые интерфейсы
+	myWallet := &Wallet{Cash: 100}
+	fmt.Printf("Raw payment: %#v\n", myWallet)
+	fmt.Printf("Способ оплаты: %s\n", myWallet)
+}

+ 42 - 0
courses/golang_web/1_data_type/interface/1.go

@@ -0,0 +1,42 @@
+package main
+
+import (
+	"fmt"
+)
+
+type Animal interface {
+	Speak() string
+}
+
+type Dog struct {
+	Name string
+}
+
+func (d Dog) Speak() string {
+	return fmt.Sprintf("Собака %s лает", d.Name)
+}
+
+type Cat struct {
+	Name string
+}
+
+func (c Cat) Speak() string {
+	return fmt.Sprintf("Кошка %s мяукает", c.Name)
+}
+
+// Функция, принимающая интерфейс Animal и вызывающая Speak
+func MakeAnimalSpeak(a Animal) {
+	fmt.Println(a.Speak())
+}
+
+func main() {
+	var animal Animal
+	fmt.Printf("Value %v, type %T\n", animal, animal)
+	dog := &Dog{Name: "Шарик"}
+	animal = dog
+	// fmt.Println(animal.Speak())
+	fmt.Printf("Value %v, type %T\n", animal, animal)
+	if animal != nil {
+		fmt.Println("animal is not nil")
+	}
+}

+ 28 - 0
courses/golang_web/1_data_type/interface/2.go

@@ -0,0 +1,28 @@
+package main
+
+import (
+	"fmt"
+)
+
+type Binary uint64
+
+func (i Binary) String() string {
+	return "Fuck"
+}
+
+func (i Binary) Get() uint64 {
+	return uint64(i)
+}
+
+func main() {
+
+	var foo int = 5
+	fmt.Println(foo, fmt.(foo))
+
+	/*
+		b := Binary(200)
+		fmt.Println("Value %v, type %T\n", b, b)
+		s := fmt.Stringer(b)
+		fmt.Println(s)
+	*/
+}

+ 15 - 0
courses/golang_web/1_data_type/interface/3.go

@@ -0,0 +1,15 @@
+package main
+
+import (
+	"fmt"
+)
+
+func main() {
+	var ptr *struct{}
+	var iface interface{}
+	iface = ptr
+	if iface == nil {
+		fmt.Println("It's nil!")
+	}
+	fmt.Println(ptr, iface)
+}

+ 23 - 0
courses/golang_web/1_data_type/interface_2.go

@@ -0,0 +1,23 @@
+package main
+
+import (
+	"fmt"
+)
+
+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 main() {
+	myWallet := &Wallet{Cash: 100}
+	fmt.Printf("Raw payment : %#v\n", myWallet)
+	fmt.Printf("Способ оплаты : %s\n", myWallet)
+}