[GO]接口

interface

接口被实现的条件

接口被实现的条件有二:

  1. 接口方法和实现的方法的格式一致(方法名、参数列表、返回值列表);
  2. 接口的所有方法都被某个struct实现。
// +build ignore

package main

import (
	"fmt"
)

type myWriter interface {
	Write(data interface{}) error
}

type writer struct {
}

// *writer实现myWriter接口
func (w *writer) Write(data interface{}) error {
	fmt.Println("data:", data)
	return nil
}

func main() {
	// 创建的是*writer类型的指针变量w
	w := new(writer)
	// 定义一个类型为myWriter的接口变量mw
	var mw myWriter
	// 然后将w赋值给mw
	mw = w
	// 测试接口变量mw是否被赋值成功
	mw.Write("我爱你")
}

小结:

  1. 接口类型变量需要实现了接口的struck给它赋值。w := new(writer);var mw myWriter = w
  2. w := new(writer)创建的是指针,而w := write{}创建的是对象;
  3. struct有指针接收者和对象接收者之分,如果都实现,编译器只认靠前的,也就是说只认指针接收者或对象接收者其中一个,接口变量只认实现了它的同一类型的指针接收者或者对象接收者;
  4. 1.接口方法和实现的方法的格式一致(方法名、参数列表、返回值列表);2.接口的所有方法都被某个struct实现。

GO接口的隐式性

GO实现接口无需在类定义时显式表示实现的接口,而是用结构体的对象或者指针对象直接实现接口里的函数。
在这里插入图片描述

目的是为了简化开发,防止出现复杂的“派生树”(接口体和类组成的一颗树,java开发经常看到)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
而GO是无法生成派生树的,因为GO的接口与接口之间、接口与结构体之间、结构体与结构体之间是平行的、组合的,不存在父子的层级关系。

资料说:因此,使用GO语言时,不需要同时也不可能有“类派生图”,开发者唯一需要关注的就是“我需要什么?”,以及“我能实现什么?”。
目前不是很理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值