当前位置:网站首页>go语言的接口
go语言的接口
2022-08-02 11:09:00 【ydl1128】
接口
接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节
//定义一个接口
type Car interface {
run()
}
type paoceh struct {
name string
}
//实现该接口的方法
func (s paoceh)run() {
fmt.Printf("%s正在跑路",s.name)
}
// Drive 调用该接口里面的run方法
func Drive(c Car) {
c.run()
}
func main() {
p := paoceh{
name: "奔驰",
}
Drive(p)
}
值接收者实现接口与指针接收者实现接口
//传入指针
func Drive2(c *paoceh) {
fmt.Println("指针的操作")
}
func main() {
p := &paoceh{
name: "奔驰",
}
Drive(p)//奔驰正在跑路
c := paoceh{
name: "奔驰",
}
Drive(c)//奔驰正在跑路
//上述结果表明传地址与值效果一样
var cc *paoceh
cc = &c
Drive2(cc)//指针的操作
}
区别:对于值接收者实现的接口,无论使用值类型还是指针类型都没有问题。但是我们并不总是能对一个值求址,所以对于指针接收者实现的接口要额外注意。
空接口的应用
使用空接口实现可以接收任意类型的函数参数。
// 空接口作为函数参数
func show(a interface{
}) {
fmt.Printf("type:%T value:%v\n", a, a)
}
空接口作为map的值
var studentInfo = make(map[string]interface{
})
studentInfo["name"] = "沙河娜扎"
studentInfo["age"] = 18
studentInfo["married"] = false
fmt.Println(studentInfo)
类型断言
想要从接口值中获取到对应的实际值需要使用类型断言,其语法格式如下。
x.(T)
x:表示接口类型的变量
T:表示断言x可能是的类型
/ justifyType 对传入的空接口类型变量x进行类型断言
func justifyType(x interface{
}) {
switch v := x.(type) {
case string:
fmt.Printf("x is a string,value is %v\n", v)
case int:
fmt.Printf("x is a int is %v\n", v)
case bool:
fmt.Printf("x is a bool is %v\n", v)
default:
fmt.Println("unsupport type!")
}
}
由于接口类型变量能够动态存储不同类型值的特点,所以很多初学者会滥用接口类型(特别是空接口)来实现编码过程中的便捷。只有当有两个或两个以上的具体类型必须以相同的方式进行处理时才需要定义接口。切记不要为了使用接口类型而增加不必要的抽象,导致不必要的运行时损耗。
在 Go 语言中接口是一个非常重要的概念和特性,使用接口类型能够实现代码的抽象和解耦,也可以隐藏某个功能的内部实现,但是缺点就是在查看源码的时候,不太方便查找到具体实现接口的类型。
边栏推荐
- 5G基础学习1、5G网络架构、网络接口及协议栈
- LayaBox---TypeScript---Three slash instructions
- 配置mysql失败了,这是怎么回事呢?
- After 21 years of graduation, I switched to software testing. From 0 income to a monthly salary of over 10,000, I am really lucky...
- 腾讯云云函数SCF—入门须知
- Several reasons why applet plugins benefit developers
- Event object, do you know it well?
- Jay Chou's new song is released, crawl the "Mojito" MV barrage, and see what the fans have to say!
- LeetCode每日一练 —— 20. 有效的括号
- 19、商品微服务-srv层实现
猜你喜欢

Deep Learning 100 Examples - Convolutional Neural Network (CNN) for mnist handwritten digit recognition

Shell编程之条件语句

The exchange - string dp

MySQL百万数据优化总结 一

How to technically ensure the quality of LED display?

Getting Started with Three.JS Programmatic Modeling

博云入选Gartner中国DevOps代表厂商

Hello, my new name is "Bronze Lock/Tongsuo"

C#/VB.NET to add more lines more columns image watermark into the Word document

sqli-labs(less-11)
随机推荐
打破千篇一律,DIY属于自己独一无二的商城
8年软件测试工程师的感悟:与薪资相匹配的永远是实力
开箱即用-使用异步加载布局来优化页面启动速度的几种方案
leetcode: 200. 岛屿数量
How to choose a truly "easy-to-use, high-performance" remote control software
只问耕耘,不问收获,其实收获却在耕耘中
当POC遇见RPA:RPA项目顺利实施的关键
4年手工测试被应届生取代了,用血与泪的教训给xdm一个忠告,该学自动化了...
find查找多类型结尾文件
FinClip | 来了, 2022 年 7 月更新大盘点
MySQL模糊查询性能优化
深度学习100例 —— 卷积神经网络(CNN)实现mnist手写数字识别
CAN总线的AUTOSAR网络管理
LeetCode笔记:Weekly Contest 304
LeetCode每日一练 —— 20. 有效的括号
Three.JS程序化建模入门
LayaBox - TypeScript - merge statement
流动性质押挖矿系统开发如何制作?单双币系统开发成熟技术
看我如何用多线程,帮助运营小姐姐解决数据校对系统变慢!
小程序插件的生态丰富,加速开发建设效率