接口

假设我有一个HUAWEI类,要实现Phone接口,可以这样做:

package main

import "fmt"

//定义一个接口
type Phone interface {
    call()
}

//定义一个类
type HUAWEI struct {
    name string
}

//用上面的HUAWEI类实现上面的Phone接口
func (myPhone HUAWEI) call() {
    fmt.Println("this is the coolest phone all around the world")
}

func main() {
    thisPhone := new(HUAWEI)
    thisPhone.call()
}

多态

Go的多态可以用接口实现,所谓多态就是同一个接口下,不同对象的不同表现,
比如我们想用多态的方式实现购买一台MacBook和Apple Watch可以这样写:

  1. 定义商品的接口
  2. 定义笔记本电脑和手表两个类
  3. 上面的每一个类都实现一下商品接口(其实所谓的实现接口 就是绑定所有接口声明的方法)
  4. 创建一个merchandise的切片来表示购物车
  5. 定义一个函数计算总金额的函数
    具体实现代码如下
package main

import (
    "fmt"
    "strconv"
)

//定义一个接口来表示商品

type Merchandise interface {
    totalPrice() int
    totalInfo() string
}

//定义两个类 :Laptop 和 Watch
type Laptop struct {
    brand    string
    quantity int
    price    int
}

type Watch struct {
    brand    string
    quantity int
    price    int
}

//上面的每一个类都实现一下Merchandise接口(其实所谓的实现接口 就是绑定所有接口声明的方法)
func (laptop Laptop) totalPrice() int {
    return laptop.price * laptop.quantity
}
func (laptop Laptop) totalInfo() string {
    return `your order contains ` + strconv.Itoa(laptop.quantity) + ` ` + laptop.brand + ` total: ` + strconv.Itoa(laptop.totalPrice()) + ` RMB`
}

func (watch Watch) totalPrice() int {
    return watch.price * watch.quantity
}
func (watch Watch) totalInfo() string {
    return `your order contains ` + strconv.Itoa(watch.quantity) + ` ` + watch.brand + ` total: ` + strconv.Itoa(watch.totalPrice()) + ` RMB`
}

//定义一个函数计算总金额的函数
func calculateTotalPrice(merchandise []Merchandise) int {
    var finalPrice int
    for _, item := range merchandise {
        fmt.Println(item.totalInfo())
        finalPrice += item.totalPrice()
    }
    return finalPrice
}

func main() {
    //    实例化两个类
    macBook := Laptop{
        brand:    "Apple-macbook",
        quantity: 1,
        price:    20000,
    }
    appleWatch := Watch{
        brand:    "AppleWatch",
        quantity: 1,
        price:    5000,
    }
    //    创建一个merchandise的切片来表示购物车
    shoppingCart := []Merchandise{macBook, appleWatch}
    //    计算总价
    finalTotalPrice := calculateTotalPrice(shoppingCart)
    fmt.Println("All you Need to pay is: ", finalTotalPrice, " RMB")
}

注意

package main

import "fmt"

func main() {
  a := 10

  switch interface{}(a).(type) {
  case int:
      fmt.Println("参数的类型是 int")
  case string:
      fmt.Println("参数的类型是 string")
  }
}