go语言学习-接口赋值的两种类型

接口赋值在go语言中分为下面两种情况:

  1. 将对象实例赋值给接口
    在我看来go语言的接口就是c++中虚函数的声明,使用者可以根据自身使用的需要声明一个函数的集合,将需要的方法都在接口中声明,有点像c++中,子类继承父类之后,通过子类对象给父类赋值,因为父类有的方法(除私有方法)子类肯定都有,尤其是虚函数,这样比C++好的地方是go语言中不需要通过继承的方式来实现多态,不同的对象只需要将接口中的所有方法都实现即可,本质上和c++一样,实现这些接口的对象相当于子类,这个接口相当于父类,不同的地方go语言中少了继承的过程,耦合度更低。
  2. 将一个接口赋值给另一个接口(同理)

将对象实例赋值给接口

这要求该对象实例实现了所有该接口提供的方法,下面是代码实例:

package main

import (
	"fmt"
)


type Integer int

func (a Integer)Less(b Integer) bool{
	return a<b
}

func (a *Integer)Add(b Integer) {
	*a += b
}


type Lesser interface {
	Less(b Integer) bool
}

type LessAdder interface {
	Less(b Integer) bool
	Add(b Integer)
}


func main(){
	fmt.Println("start ...")

	var inter Integer = 1

	var lesser Lesser = inter

	isLess := lesser.Less(3)

	fmt.Println(lesser,"less 3 is ",isLess)

	var lessAdder LessAdder = &inter

	lessAdder.Add(3)
	fmt.Println("lessAdder add 3 is ",inter)
	//fmt.Println("lessAdder is ",*lessAdder) //该条语句不能通过编译
}

第二种方法通过一个接口给另一个接口赋值,在go语言中只要两个接口拥有同样的方法列表(次序不同不要紧),那么他们就是等同的,可以相互赋值

package one
type ReadWriter interface{
	Read(buf []byte)(n int,err error)
	Write(buf []byte)(n int,err error)
}


package two

type Istream interface{
	Read(buf []byte)(n int,err error)
	Write(buf []byte)(n int,err error)
}

var file1 one.ReadWriter = new(file)
var file2 two.Istream = file1
var file3 one.ReadWriter = file2

在go语言中,这两个接口是等价的,因为:

  1. 任何实现了one.ReadWriter接口的类,均实现了two.ReadWriter
  2. 任何one.ReadWriter的接口可以赋值给two.ReadWriter,反之亦然
  3. 在任何地方使用two.ReadWriter的接口和使用one.ReadWriter的接口没有差别

接口赋值并不是要求两个接口是等价的,如果A的方法列表是接口B的方法列表的子集,那么接口B可以赋值给接口A,但是反过来就不成立

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值