7.1 接口摘自《go语言学习笔记》

1,接口实现机制:只要目标方法集内包含接口声明的全部方法,就被视为实现了该接口,无需做显示声明。目标类型可以实现多个接口。

2,内部实现,接口自身也是一种结构类型

type iface struct {
	tab *itab
	data unsafe.Pointer
}
  1. 不能有字段
  2. 不能定义自己的方法。
  3. 只能声明方法,不能实现。
  4. 可嵌入其它接口类型。

3,接口通常以er作为接口后缀,方法名是声明组成部分,但参数名可不同或省略

type tester interface {
    test()
    string() string
}

type data struct {}

func(*data) test(){}

func(data) string() string {return ""}

func main(){
	var d data

	//var t tester = d error : data does not implements tester (test method has pointer receiver)
	var t tester = &d
	t.test()
	fmt.Println(t.string())
}

4,如果接口没有任何方法,那么就是个空接口(interface{}),它的用途类似面向对象里的跟类型Object,可被赋值为任何类型的对象

5,可以像匿名字段那样,嵌入其它接口。目标类型方法集中必须拥有包含嵌入接口方法在内的全部方法,才算实现了该接口

type stringer interface {
	string() string
}
type tester interface {
	stringer
	test()
}

type data struct {}

func (*data) test() {}
func (data) string() string {
	return ""
}

func main(){
	var d data

	var t tester = &d
	t.test()
	fmt.Println(t.string())
}

6,超级接口变量可以隐式转换为子集,反过来不行

func pp(a stringer){
	fmt.Println(a.string())
}

func main(){
	var d data

	var t tester = &d
	pp(t) //隐式转换为子集接口

	var s stringer  = t //超集转化为子集
	fmt.Println(s.string())

	// var t2 tester = s //error

}

7,支持匿名接口类型,可直接用于变量定义,或作为结构字段类型

package main

import "fmt"

type data struct {}

func (data) string() string {
	return ""
}

type node struct {
	data interface { //匿名接口类型
		string() string
	}
}

func main(){
	var t interface {
		string() string
	} = data{}

	n := node{
		data:t,
	}

	fmt.Println(n.data.string())
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值