iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang中结构体嵌套接口如何实现
  • 574
分享到

golang中结构体嵌套接口如何实现

2023-07-05 20:07:22 574人浏览 八月长安
摘要

今天小编给大家分享一下golang中结构体嵌套接口如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在Golang中结构

今天小编给大家分享一下golang中结构体嵌套接口如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Golang中结构体A嵌套另一个结构体B见的很多,可以扩展A的能力。

A不仅拥有了B的属性,还拥有了B的方法,这里面还有一个字段提升的概念。

示例:

package mainimport "fmt"type Worker struct {    Name string    Age int    Salary}func (w Worker) fun1() {    fmt.Println("Worker fun1")}type Salary struct {    Money int}func (s Salary) fun1() {    fmt.Println("Salary fun1")}func (s Salary) fun2() {    fmt.Println("Salary fun2")}func main() {    s := Salary{}    w := Worker{Salary: s}    //w.Name    //w.Age    //w.Money    //w.Salary    //w.fun1()    //w.fun2()    //w.Salary.fun1()    //w.Salary.fun2()}

很明显现在 Worker 强依赖与 Salary ,有时候我们希望 Worker 只依赖于一个接口,这样只要实现了此接口的对象都可以传递进来。

优化后:

package mainimport "fmt"type Inter1 interface {    fun1()    fun2()}type Worker struct {    Name string    Age int    Inter1}func (w Worker) fun1() {    fmt.Println("Worker fun1")}type Salary struct {    Money int}func (s Salary) fun1() {    fmt.Println("Salary fun1")}func (s Salary) fun2() {    fmt.Println("Salary fun2")}func main() {    s := Salary{}    w := Worker{Inter1: s}    //w.Age    //w.Name    //w.fun1()    //w.fun2()    //w.Inter1    //w.Inter1.fun1()    //w.Inter1.fun2()    // 无法访问 Money 属性,可以增加方法来实现}

Worker 依赖一个 Inter1 接口,只要实现了 Inter1 的对象都可以注入。
Worker 也实现了 Inter1 接口。
Worker 可以重新实现 Inter1 接口的方法。

golang的context标准库就是这样实现的context之间的嵌套。

另外,需要注意的是,一个结构体包含了一个接口,那么此结构体自然就是这个接口的一个实现,即便这个结构体没有实现任何方法

type man interface {    Eat(args ...any)}type dog struct {    man}func testDog() {    d := dog{}    d.Eat(1)}

显然这里的调用会报错。

golang接口的这种隐式的实现特性,会导致某个对象无意间就实现了某个接口,然而对于一些底层接口却需要保持其封闭性,为了达到这个目的,通常的做法是,在接口中有特殊含义的方法,比如runtime.Error接口,注释就说明了意图

// The Error interface identifies a run time error.type Error interface {    error    // RuntimeError is a no-op function but    // serves to distinguish types that are run time    // errors from ordinary errors: a type is a    // run time error if it has a RuntimeError method.    RuntimeError()}

或者定义一个无法导出的方法,这样在包外面就无法被实现了,比如testing.TB接口

// TB is the interface common to T, B, and F.type TB interface {    Cleanup(func())    Error(args ...any)    Errorf(fORMat string, args ...any)    Fail()    FailNow()    Failed() bool    Fatal(args ...any)    Fatalf(format string, args ...any)    Helper()    Log(args ...any)    Logf(format string, args ...any)    Name() string    Setenv(key, value string)    Skip(args ...any)    SkipNow()    Skipf(format string, args ...any)    Skipped() bool    TempDir() string    // A private method to prevent users implementing the    // interface and so future additions to it will not    // violate Go 1 compatibility.    private()}

第一种方法显然只能防君子,不能防小人。

第二种方法看起来比较安全,但是结合我们上面的知识,如果使用结构体来包含这个接口呢?是不是也能实现这个接口?

type MyTB struct {    testing.TB}

显然MyTB已经实现了testing.TB,但是此时调用是会报错的

func main() {    tb := new(MyTB)    tb.Fatal("hello", "world")}

实现其中的一个方法,再调用即可

func (p *MyTB) Fatal(args ...interface{}) {    fmt.Println(args...)}func main() {    tb := new(MyTB)    tb.Fatal("hello", "world")}

既然MyTB实现了testing.TB,那么就可以做隐式转换

var tb testing.TB = new(MyTB)tb.Fatal("hello", "world")

以上就是“golang中结构体嵌套接口如何实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网GO频道。

您可能感兴趣的文档:

--结束END--

本文标题: golang中结构体嵌套接口如何实现

本文链接: https://www.lsjlt.com/news/355015.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • golang中结构体嵌套接口如何实现
    今天小编给大家分享一下golang中结构体嵌套接口如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在golang中结构...
    99+
    2023-07-05
  • golang中结构体嵌套接口的实现
    在golang中结构体A嵌套另一个结构体B见的很多,可以扩展A的能力。 A不仅拥有了B的属性,还拥有了B的方法,这里面还有一个字段提升的概念。 示例: package main i...
    99+
    2023-05-14
    golang 结构体嵌套接口 golang 嵌套接口
  • golang 接口嵌套实现复用的操作
    大家还是直接看代码吧~ package main import ( "fmt" ) func main() { start(NewB(C{})) star...
    99+
    2022-11-12
  • 怎么在golang中通过接口嵌套实现复用
    本篇文章为大家展示了怎么在golang中通过接口嵌套实现复用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。golang适合做什么golang可以做服务器端开发,但golang很适合做日志处理、数据打...
    99+
    2023-06-14
  • 怎么在golang中利用结构体嵌套的切片数组
    本篇文章为大家展示了怎么在golang中利用结构体嵌套的切片数组,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是golanggolang 是Google开发的一种静态强类型、编译型、并发型,并具...
    99+
    2023-06-14
  • Golang如何实现Json转结构体
    这篇文章主要讲解了“Golang如何实现Json转结构体”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang如何实现Json转结构体”吧!请求Zabbix API,通过itemid获取...
    99+
    2023-07-05
  • Golang如何实现不被复制的结构体
    这篇文章主要介绍“Golang如何实现不被复制的结构体”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang如何实现不被复制的结构体”文章能帮助大家解决问题。不允许复制的结构体sync包中的许多...
    99+
    2023-07-05
  • golang接口如何实现
    今天小编给大家分享一下golang接口如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在golang中,可以使用“ty...
    99+
    2023-07-04
  • Python中的嵌套类如何实现
    Q: python的类里可以写类吗A : 是的,Python中的类可以包含其他类,这些类被称为嵌套类或嵌套类型。在类中定义嵌套类的语法与在模块中定义类的语法相同。例如,下面是一个包含嵌套类的示例:class OuterClass: ...
    99+
    2023-05-14
    Python
  • Golang如何实现数据结构Stack
    本文小编为大家详细介绍“Golang如何实现数据结构Stack”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang如何实现数据结构Stack”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。介绍Stack在计...
    99+
    2023-07-06
  • Go Struct结构体如何实现
    本文小编为大家详细介绍“Go Struct结构体如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go Struct结构体如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是结构...
    99+
    2023-07-05
  • 怎么在golang中实现两个结构体复制字段
    怎么在golang中实现两个结构体复制字段?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。golang的优点golang是一种编译语言,可以将代码编译为机器代码,...
    99+
    2023-06-14
  • VueJs中如何使用Teleport及组件嵌套层次结构详解
    目录正文01-组件套组件层次结构很深时02-Teleport组件03-需要知道的04-如何禁用 Teleport05-多个 Teleport 共享目标时总结正文 ...
    99+
    2023-05-14
    VueJs使用Teleport组件 VueJs Teleport嵌套层次结构
  • c# 如何使用结构体实现共用体
    目录理解 C 语言的共用体使用 C# 实现共用体共用体作为另一个共用体的成员在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的...
    99+
    2022-11-12
  • C语言中的结构体内嵌函数如何使用
    今天小编给大家分享一下C语言中的结构体内嵌函数如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。C语言的结构体内嵌函数看...
    99+
    2023-07-05
  • Java接口返回省市区树形结构如何实现
    这篇文章主要介绍“Java接口返回省市区树形结构如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java接口返回省市区树形结构如何实现”文章能帮助大家解决问题。前言最近和前端联调接口,需要进行...
    99+
    2023-07-04
  • 如何用python实现结构体数组
    目录python结构体数组在NumPy中可以如下定义内存对齐python自定义结构体具体方法如下python结构体数组 在C语言中我们可以通过struct关键字定义结构类型,结构中的...
    99+
    2022-11-11
  • golang中如何按照结构体的某个字段排序
    本文小编为大家详细介绍“golang中如何按照结构体的某个字段排序”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang中如何按照结构体的某个字段排序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概述gol...
    99+
    2023-06-30
  • Golang如何实现单元测试中的接口层
    这篇文章主要介绍“Golang如何实现单元测试中的接口层”,在日常操作中,相信很多人在Golang如何实现单元测试中的接口层问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang如何实现单元测试中的接口层...
    99+
    2023-07-05
  • 如何实现shell中嵌套执行expect命令
    本篇内容主要讲解“如何实现shell中嵌套执行expect命令”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现shell中嵌套执行expect命令”吧!1.先安装expect代码如下:yu...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作