Erlo

go语言的接口案例

2021-04-17 20:31:47 发布   628 浏览  
页面报错/反馈
收藏 点赞

学习资料来自
https://www.bilibili.com/video/BV1jJ411c7s3?p=93

自定义一个接口

package main

import "fmt"

func main(){
	m1 :=Mouse{"shubiao"}
	testInterface(m1)

	f1 := FlashDisk{"flashdisk"}
	testInterface(f1)
}
//1.定义接口
type USB interface{
	start()
	end()
}
//2.实现类
type Mouse struct{
	name string
}
type FlashDisk struct{
	name string
}
func (m Mouse)start(){
	fmt.Println("point start")
}
func (m Mouse)end(){
	fmt.Println("point end")
}
func (m FlashDisk)start(){
	fmt.Println("flash start")
}
func (m FlashDisk)end(){
	fmt.Println("flash end")
}
//3、调试方法
func testInterface(usb USB ){
	usb.start()
	usb.end()
}

接口多态

将上述的main函数修改如下:

func main(){
	m1 :=Mouse{"shubiao"}

	f1 := FlashDisk{"flashdisk"}

	var usb [2]USB
	usb[0] = f1
	testInterface(usb[0])

	usb[1] = m1
	testInterface(usb[1])
}

空接口的使用

package main

import "fmt"

func main(){
	var a1 A =Cat{"花猫"}
	test1(a1)

	var a2 A =Person{"老王",12}
	test2(a2)

	map1 :=make(  map[string]interface{} )
	map1["name"]="李华"
	map1["age"]=300
	fmt.Println(map1)

	slice := make ([]interface{},0,10)
	slice = append(slice,a1,a2)
	fmt.Println(slice)
}
func test1(a A){
	fmt.Println(a)
}
func test2(a interface{}){
	fmt.Println(a)
}
type A interface{

}
type Cat struct{
	color string
}
type Person struct{
	name string
	age int
}

接口嵌套

package main

import "fmt"

func main() {
	var cat Cat =Cat{}
	var a1 A= cat
	a1.test1()
	var b1 B =cat
	b1.test2()
	var c1 C =cat
	c1.test3()
}
type A interface{
	test1()
}
type B interface{
	test2()
}
type C interface{
	A
	B
	test3()
}
type Cat struct{

}
func (c Cat)test1(){
	fmt.Println("test1()")
}
func (c Cat)test2(){
	fmt.Println("test2()")
}
func (c Cat)test3(){
	fmt.Println("test3()")
}

接口断言

package main

import (
	"fmt"
	"math"
)

/*
	接口断言:
	方法1:instacne := 接口对象.(实际类型)//不安全
	方法2: instance ,ok :=接口对象.(实际类型)//安全
	方法3:switch instance := 接口对象.(type){
		case 实际类型1:
		case 实际类型2:
	}

 */
func main(){
	var t1 Triangle =Triangle{1,2.4,3.3}
	getType2(t1)
	fmt.Println(t1.area())
}

//1.定义一个接口
type Shape interface{
	peri()float64
	area()float64
}
type Triangle struct{
	a,b,c float64
}
func (t Triangle)peri()float64{
	return t.a t.b t.c
}
func (t Triangle)area()float64{
	p := t.peri()/2
	s := math.Sqrt(p*(p-t.a)*(p-t.b)*(p-t.c))
	return s
}
type Circle struct{
	radius float64
}
func (c Circle)peri()float64{
	return math.Pi*c.radius*2
}
func (c Circle)area()float64{
	return math.Pi*c.radius*c.radius
}
func getType(s Shape){
	//断言
	if ins ,ok:=s.(Triangle);ok{
		fmt.Println("三角形,三边是",ins.a,ins.b,ins.c,"面积是",ins.area())
	}else if ins,ok :=s.(Circle);ok{
		fmt.Println("是圆形,半径是",ins.radius,"面积是",ins.area())
	}else{
		fmt.Println("异常")
	}
}


func getType2(s Shape){
	switch ins := s.(type){
	case Triangle:
		fmt.Println("三角形,三边是",ins.a,ins.b,ins.c,"面积是",ins.area())
	case Circle:
		fmt.Println("是圆形,半径是",ins.radius,"面积是",ins.area())
	default:
		fmt.Println("未知异常")
	}

}

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认