Go interface

接口实现:

  • 在go中,接口是一组方法的签名
  • 实现接口:某个类型为这个接口中所有方法提供了方法的实现
  • go语言中,接口和类型的实现关系,不需要声明。(声明类型,例如java:class Mouse implements USB{})
  • 当需要接口类型的对象时,可以使用任意实现类型对象代替
  • 接口对象不能访问实现类的属性
package main

import "fmt"

type USB interface {
    start()
    end()
}

type Mouse struct {
    name string
}

func (m Mouse) start() {
    fmt.Println(m.name, "开始使用了")
}

func (m Mouse) end() {
    fmt.Println(m.name, "使用结束了")
}

func testF(u USB) {  // 这里可以传入任意实现结构体方法的对象
    u.start()
    u.end()
}

func main() {
    m := Mouse{name:"罗技鼠标"}
    fmt.Println(m.name)  // 罗技鼠标

    testF(m)  // 调用接口实现的方法

    var u USB
    u = m
    u.start()  // 开始使用了
    u.end()    // 使用结束了
    //fmt.Println(u.name)     // 这里u对象没有name属性,会报错
}

方法中接收者参数:

  • 方法中接收者定义为指针,传递实例对象也必须是指针类型
  • 方法中接收者定义为值,传递实例对象也必须是值类型
// 指针类型

type People interface {
	Speak(string) string
}

type Student struct {
	name string
}

func (stu *Student) Speak(think string) (talk string) {
	if think == "sb" {
		talk = "你是个大帅比"
	} else {
		talk = "您好"
	}
	fmt.Println(talk)
	return
}

func main() {

	var peo = &Student{name: "afsf"}
	peo.Speak("aa")
}
// 值类型

type People interface {
	Speak(string) string
}

type Student struct {
	name string
}

func (stu Student) Speak(think string) (talk string) {
	if think == "sb" {
		talk = "你是个大帅比"
	} else {
		talk = "您好"
	}
	fmt.Println(talk)
	return
}

func main() {

	var peo = Student{name: "afsf"}   // 值传递
	peo.Speak("aa")
}

接口嵌套:

package main

import "fmt"

type Person struct{} // 如果想要实现接口C,那不止要实现接口C的方法,还要实现接口A,B中的方法才行

type A interface {
	test1()
}

type B interface {
	test2()
}

type C interface {
	A
	B
	test3()
}

func (p Person) test1() {
	fmt.Println("test1")
}

func (p Person) test2() {
	fmt.Println("test2")
}

func (p Person) test3() {
	fmt.Println("test3")
}

func main() {
	var p = Person{}

	var a1 A = p // a1只有test1方法
	a1.test1()

	var b1 B = p // b1只有test2方法
	b1.test2()

	var c1 C = p
	c1.test1()
	c1.test2()
	c1.test3()

	// 父接口实现的方法少,不能赋值给子接口
	// c1 = a1
	// c1.test1()  // 报错

	// 子接口实现的方法多,不能赋值给父接口
	a1 = c1
	a1.test1()
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值