package main
import (
"fmt"
"math"
)
//1.定义一个方法
type shape interface {
peri() float64
area() float64
}
//2.定义实现类:三角形
//实现类:实现了接口中所有的方法
type Trianger struct {
a, b, c float64
}
//3.定义实现类:圆形
type Cricle struct {
radius float64
}
//求周长
func (t Trianger) peri() float64 {
return t.a + t.b + t.c
}
//海伦公式 求面积
func (t Trianger) area() float64 {
p := t.peri() / 2 //半周长
s := math.Sqrt(p * (p - t.a) * (p - t.b) * (p - t.c))
return s
}
//求圆形的周长
func (c Cricle) peri() float64 {
return 2 * math.Pi * c.radius
}
//海伦公式 求面积
func (c Cricle) area() float64 {
return math.Pow(c.radius, 2) * math.Pi
}
//获取类型 方法一
func getType(s shape) {
if ins, ok := s.(Trianger); ok {
fmt.Printf("是个三角形 三条边是 %f %f %f \n", ins.a, ins.b, ins.c)
} else if ins, ok := s.(Cricle); ok {
fmt.Printf("是个圆形 半径是 %f \n", ins.radius)
}
}
//获取类型 方法二
func getType1(s shape) {
switch ins := s.(type) {
case Trianger:
{
fmt.Printf("是个三角形 三条边是 %f %f %f \n", ins.a, ins.b, ins.c)
}
case Cricle:
{
fmt.Printf("是个圆形 半径是 %f \n", ins.radius)
}
}
}
func main() {
//多态:一个事物的多种形态
t1 := Trianger{3, 4, 5}
fmt.Println(t1.peri())
fmt.Println(t1.area())
fmt.Println(t1.a, t1.b, t1.c) //可以访问属性
var s1 shape
s1 = t1 //实现类看做接口类型 向上转型
fmt.Println(s1.peri())
fmt.Println(s1.area()) //可以访问方法 无法访问属性
var s2 shape
s2 = Cricle{4}
fmt.Println(s2.peri())
fmt.Println(s2.area())
getType(t1)
getType(s2)
getType1(t1)
getType1(s2)
}
有疑问加站长微信联系(非本文作者)