接口
假设我有一个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可以这样写:
- 定义商品的接口
- 定义笔记本电脑和手表两个类
- 上面的每一个类都实现一下商品接口(其实所谓的实现接口 就是绑定所有接口声明的方法)
- 创建一个merchandise的切片来表示购物车
- 定义一个函数计算总金额的函数
具体实现代码如下
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")
}
注意
- 上面的main中我们都没有用var xxx InterfaceName 的方式去显示化实现一个接口,而是用:=的方式隐式声明,这样就不会因为接口的限制无法给自己的类绑定接口以外的方法,详情可以参考https://golang.iswbm.com/c02/...
只有静态类型为接口,才可以进行类型断言,否则需要像下面一样转成接口类型,比如
package main import "fmt" func main() { a := 10 switch interface{}(a).(type) { case int: fmt.Println("参数的类型是 int") case string: fmt.Println("参数的类型是 string") } }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。