go语言 接口 interface{}
程序员文章站
2022-06-14 10:58:42
...
package main
import (
"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
}
//定义文件结构 用于实现DataWriter
type 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")
}
上一篇: Oracle 11g + ASM DBCA 建库问题解决心得
下一篇: IO多路复用之epoll