首页 > 其他分享 >Go的接口

Go的接口

时间:2022-10-09 21:12:42浏览次数:41  
标签:fmt 接口 Println Go type Biter

理解Go的接口

在Go中其实更好理解接口的定义,接口就是对一类结构体的规范,属于这个接口的结构体都实现了一些方法
但是在Go中其实是一种隐式的方法,并没有像Java一样用implement的方法去实现一个接口
只要你实现了一个接口的所有方法,那么你就实现了这个接口,其实某种程度上也是Go多态的体现

Go接口的定义方式

// Animal 定义了是Biter又是Sayer的类型
type Animal interface {
	Biter
	Sayer
}

// Biter 定义了一种类型,一种抽象的类型,只要实现了say()这个方法的类型都可以成为sayer类型
type Biter interface {
	// 方法名字(参数) 返回值
	bite()
}

type Sayer interface {
	say()
}

Go中实现一个接口

隐式实现即可

type Dog struct {
}

func (dog Dog) bite() {
	fmt.Println("狗咬人")
}

func (dog Dog) say() {
	fmt.Println("saysaysay!")
}

“多态”

Go说是一种没有多态的语言,但是这也可以理解成多态

func bited(animal Biter) {
	animal.bite()
}

var animal Biter
animal = &Cat{}
bited(animal) // #狗咬人

接口值

接口值是维护了接口动态类型以及接口动态具体值的
如果一个接口类型为空,值也空,它是nil的,但是如果它类型不为空,即使维护的接口值是空的,它也不是nil
在Go中对nil的判断要谨慎,比如slice,它注定不是nil的,就要同时用len(slice)去判断它是否非空

空接口类型判断

空接口的存在很像是Java中的Object,由于它的存在,它可以用在Map里面当Value,也可以作为函数的参数来使用
同时它的类型也要好好处理,不然的话容易出错, 下面这就是接口类型断言的办法
x.(type)

	// 类型断言, 这里会返回结果的,通过OK去判断是不是这个类型
	if ret, ok := x.(Biter); ok {
		fmt.Println(ret)
	} else {
		fmt.Println("", ret)
	}

	switch v := x.(type) {
	case Animal:
		fmt.Println("Animal", v)
	case Biter:
		fmt.Println("Biter", v)
	default:
		fmt.Println("don't know", v)
	}

标签:fmt,接口,Println,Go,type,Biter
From: https://www.cnblogs.com/azxx/p/16773715.html

相关文章

  • Go Mutex 源码详解
    前言在上一篇文章中,我们一起学习了如何使用​​Go​​​中的互斥锁​​Mutex​​​,那么本篇文章,我们就一起来探究下​​Mutex​​底层是如何实现的,知其然,更要知其所以......
  • [Algorithm] DP - Min Number of Jumps
    You'regivenanon-emptyarrayofpositiveintegerswhereeachintegerrepresentsthemaximumnumberofstepsyoucantakeforwardinthearray.Forexa......
  • 1、 Collection接口
    集合介绍可以动态保存任意多个对象,使用比较方便提供了一系列方便的操作对象的方法:add,remove,set,get等使用集合添加,删除新元素的失意代码-简洁了集合主要是两组(......
  • 分享Go书籍-《Go Web编程》
    大家好,我是沙漠尽头的狼。最近几天在看一本Go的书籍,看了100来页,感觉不错,分享给大家。书籍基本信息书籍信息:书名:GoWeb编程作者:(新加坡)郑兆雄(SauSheongChang)著;黄健......
  • 国庆学go,完成了博客基本功能,迫不及待的发布上线了
    大家好,我是沙漠尽头的狼。国庆7天,利用带娃之余的空闲时间学习了go,并做了一个不是很完善的博客前台网站。网站发布地址:​​https://go.dotnet9.com​​源码边做边上传Github,......
  • Go 异常处理流程
    前言有这样一段代码:funcmain(){ //捕捉异常 deferfunc(){ iferr:=recover();err!=nil{ fmt.Println(err) } }() gofunc(){ fmt.Println("st......
  • 【Vue】axios二次封装,统一接口管理
    1.安装axiosnpminstall--saveaxios  2.创建封装js配置请求拦截器,可以在请求发送前进行统一预处理请求,不用每次在请求的时候手动添加协议头token等配置reques......
  • Django2.0——cookie、session的简单处理
    1.cookie设置ifuserResultanduserResult.is_active: response=redirect(to='/') response.set_cookie("username",username,max_age=3600) context["username"]=use......
  • eDP接口简介
    1.eDP背景介绍 随着显示分辨率的越来越高,传统的VGA、DVI等接口逐渐不能满足人们的视觉需求。随后就产生了以HDMI、DisplayPort为代表的新型数字接口,外部接口方......
  • gorm中的关联操作详解
    一对一belongto属于:可以理解为舔狗认为自己属于女神,而女神都不知道舔狗的存在typeGirlstruct{ Idint Namestring } typeDogstruct{ Idint Na......