go语言 接口 interface{}
发布日期:2021-06-30 15:37:05
浏览次数:2
分类:技术文章
本文共 2380 字,大约阅读时间需要 7 分钟。
package mainimport ( "fmt" "io")//接口声明格式/** type 接口类型 interface{ 方法名1(参数)(返回值) 方法名2(参数)(返回值) }接口类型名 使用type将接口定义为自定义的类型名 接口在命名时 一般会在单词后面加 er如有操作的接口就是 Writer 如有字符串功能的接口就是 Stringer 有关闭功能的接口 Closer方法名 当方法名首字母大写时 且这个接口类型名首字母也是大时这个接口可以被接口所在的包(package)之外访问*///参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以被忽略,例如:type writer interface { Writer([]byte) error}//开发中常见的接口及写法type Writer2 interface { Writer([]byte) (n int, err error)}//类似 将一个对象以字符串形式展现的接口type Stringer interface { String() string}//接口被实现的条件有两种// 1.接口的方法与实现接口的类型方法格式一致// 2.接口中所有方法均被实现//在类型中添加与接口签名一致的方法就可以实现该方法//签名包括方法中的名称 参数列表 返回值列表//也就是说 只要实现接口类型中的方法的名称参数列表返回值列表中的任意一项与接口要实现的方法不一致,那么接口的这个方法就不会被实现//为了抽象数据写入的过程,定义 DataWriter 接口来描述数据写入需要实现的方法,接口中的 WriteData() 方法表示将数据写入,写入方无须关心写入到哪里。//实现接口的类型实现 WriteData 方法时,会具体编写将数据写入到什么结构中。这里使用file结构体实现 DataWriter 接口的 WriteData 方法,//方法内部只是打印一个日志,表示有数据写入,详细实现过程请参考下面的代码。//定义一个数据写入器type DataWriter interface { WriteData(data interface{}) error // 能否写入 如果这个没有被实现就会报错 CanWrite() bool}//定义文件结构 用于实现DataWritertype file struct {}// 实现DataWriter接口的WriteData方法func (d *file) WriteData(data interface{}) error { // 模拟写入数据 fmt.Println("WriteData:", data) return nil}func (c *file) CanWrite() bool { return true}//类型 与接口的关系//类型和接口之间有一对多和多对一的关系//一个类型可实现多个接口//网络上的两个程序通过一个双向的通信连接实现数据的交换//连接的一端称为socket socket同时能读取和写入数据type Socket struct {}func (s *Socket) Write(p []byte) (n int, err error) { return 0, nil}func (s *Socket) Close() error { return nil}//定义接口type Writer interface { Write(p []byte) (n int, err error)}type Closer interface { Close()}// 使用io.Writer2的代码, 并不知道Socket和io.Closer的存在func usingWriter(writer io.Writer) { writer.Write(nil)}// 使用io.Closer, 并不知道Socket和io.Writer的存在func usingCloser(closer io.Closer) { closer.Close()}//多个类型实现相同的接口type Service interface { Start() // 开启服务 Log(string) // 日志输出}//日志type Logger struct {}// 实现Service的Log()方法func (g *Logger) Log(l string) { fmt.Println(l)}// 游戏服务type GameService struct { Logger // 嵌入日志器}// 实现Service的Start()方法func (g *GameService) Start() {}func main() { //实例化 f := new(file) // 声明一个DataWriter的接口 var writer DataWriter // 将接口赋值f,也就是*file类型 writer = f // 使用DataWriter接口进行数据写入 writer.WriteData("data") writer.CanWrite() // 实例化Socket s := new(Socket) usingWriter(s) usingCloser(s) Service := new(GameService) Service.Start() Service.Log("hello Json")}
转载地址:https://jsonll.blog.csdn.net/article/details/103819189 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月13日 10时01分53秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
序列化的高阶认识-绕开 transient 机制的办法
2019-05-01
Java 序列化的一些简 单总结
2019-05-01
分布式架构下常见序列化技术-了解序列化的发展
2019-05-01
Java判断字符串是否为数字(浮点类型也包括)
2019-05-01
DNS服务各功能实现方法
2019-05-01
Nginx服务各功能实现方法
2019-05-01
docker 编译 文件 执行 dockerfile 报错 :debconf: delaying package configuration, since apt-utils is not ins
2019-05-01
ubuntu 完全卸载docker
2019-05-01
nvidia-docker 运行镜像
2019-05-01
Err:11 https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu2004/x86_64 Packages 404 No
2019-05-01
2021-05-14 技术记录
2019-05-01
ubuntu opencv-python 安装很慢问题
2019-05-01
ubuntu 升级cmake 版本
2019-05-01
docker ubuntu 下 配置 opencv caffe 记录
2019-05-01
cudnn cuda-11.0
2019-05-01
2021-05-15 apt update 更新问题
2019-05-01
MySQL5.7版本修改了my.ini配置文件后mysql服务无法启动问题
2019-05-01
【大数据开发】Java基础 -总结21-Hashmap和HashTable的区别
2019-05-01
MySQL中关于decimal与double字段类型的区别
2019-05-01