golang用struct实现继承和多重继承

零、知识点

继承
一个结构体嵌到另一个结构体,称作组合。

匿名和组合的区别:
1.如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问匿名结构体的方法,从而实现继承。
2.如果一个struct嵌套了另一个【有名】的结构体,那么这个模式叫做组合。
3.如果一个struct嵌套了多个匿名结构体,那么这个结构可以直接访问多个匿名结构体的方法,从而实现多重继承。

一、继承

1.1 代码

package main

import (
	"fmt"
)

type Person struct {
	Name string
}

type Student struct {
	Person
	Class int
}

func main() {
	var s Student

	s.Name = "Tom"
	s.Class = 3

	fmt.Println(s)
}

1.2 运行结果

[root@bogon go]# go run test.go 
{{Tom} 3}

二、多重继承

2.1 代码

package main

import (
	"fmt"
)

type Person struct {
	Name string
}

type School struct {
	Name string
}

type Student struct {
	Person
	Class int
	School
}

func main() {
	var s Student

	s.Person.Name = "Tom"
	s.School.Name = "DiYiXiaoXue"
	s.Class = 3

	fmt.Println(s)
}

2.2 运行结果

[root@bogon go]# go run test.go 
{{Tom} 3 {DiYiXiaoXue}}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang 中,可以通过组合和嵌入接口来实现接口的继承。同时,可以通过实现责任链模式来实现多个对象的链式处理。 具实现如下: 首先,定义一个基础接口 `Handler`,包含一个处理请求的方法 `HandleRequest`: ```go type Handler interface { HandleRequest(request string) (string, error) } ``` 然后,定义一个实现了 `Handler` 接口的具处理器 `ConcreteHandler`: ```go type ConcreteHandler struct { next Handler } func (h *ConcreteHandler) HandleRequest(request string) (string, error) { // 处理请求 if request == "foo" { return "handled by ConcreteHandler", nil } // 传递给下一个处理器 if h.next != nil { return h.next.HandleRequest(request) } // 没有处理器能够处理该请求 return "", fmt.Errorf("no handler found for request %s", request) } ``` 接下来,定义一个实现了 `Handler` 接口的中间件 `MiddlewareHandler`,并通过嵌入 `ConcreteHandler` 实现接口的继承: ```go type MiddlewareHandler struct { ConcreteHandler } func (h *MiddlewareHandler) HandleRequest(request string) (string, error) { // 在处理请求前进行中间件处理 modifiedRequest := "middleware:" + request // 交由 ConcreteHandler 处理 return h.ConcreteHandler.HandleRequest(modifiedRequest) } ``` 最后,我们可以创建一个责任链,将多个处理器按顺序连接起来: ```go func main() { // 创建处理器链 handler := &MiddlewareHandler{ ConcreteHandler: ConcreteHandler{ next: &ConcreteHandler{}, }, } // 处理请求 response, err := handler.HandleRequest("foo") if err != nil { fmt.Println(err) return } fmt.Println(response) } ``` 这样,我们就成功地实现了接口的继承和责任链模式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值