广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言之嵌入类型详解
  • 171
分享到

Go语言之嵌入类型详解

2024-04-02 19:04:59 171人浏览 薄情痞子
摘要

一、什么是嵌入类型 先看如下代码: type user struct { name string email string } type admin struct

一、什么是嵌入类型

先看如下代码:

type user struct {
    name string
    email string
}

type admin struct {
    user // Embedded Type
    level string
}

可以看到admin结构中的一个成员是user,那么admin中就嵌入了user类型。

  • admin也叫做外部类型
  • user也叫做内部类型

二、外部类型和内部类型之间的关系和机制

func (u *user) notify() {
    fmt.Printf("Sending user email to %s<%s>\n",
        u.name,
        u.email)
}

如上代码,实现了一个方法notify(),接收者是 *user。

func main() {
    // Create an admin user.
    ad := admin{
        user: user{
            name: "john smith",
            email: "john@yahoo.com",
        },
        level: "super",
    }
    // We can access the inner type's method directly.
    ad.user.notify()
    // The inner type's method is promoted.
    ad.notify()
}

main函数中定义了一个变量ad,并且进行了赋值

运行:

Sending user email to john smith<john@yahoo.com>
Sending user email to john smith<john@yahoo.com>

①没有编译错误

②notify()可以被ad.user调用是可以理解的,但是ad.notify()也能执行是为什么。

这里涉及到了一个嵌入类型背后的机制,内部类型提升 (感觉有点像C#、Java里面的继承,user是父类,admin是子类,admin的实例对象直接调用了父类的notify方法。)

进一步研究:我们再定义一个接口、以及一个接受该接口的函数。

接口,只有一个方法notify

type notifier interface {
    notify()
}

函数,接受一个实现notifier接口的类型实例,内部就是调用notify方法

func sendNotification(n notifier) {
    n.notify()
}

main方法如下

func main() {
    // Create an admin user.
    ad := admin{
        user: user{
            name: "john smith",
            email: "john@yahoo.com",
        },
        level: "super",
    }
    
    var user = ad.user
    sendNotification(&user)

    sendNotification(&ad)
}

运行结果:

Sending user email to john smith<john@yahoo.com>
Sending user email to john smith<john@yahoo.com>

①可以看到这里传入 &user和&ad都是可以的,说明类型提升导致admin也是实现了notifier接口了。

②为什么穿&user和&ad,而不是直接传user和ad,这就涉及到了之前总结过的【方法集】的概念了。复习一下:

从上面两个表,可以知道由于方法的接收者是 *user ,所以说只有*user实现了该接口的方法,这就是为什么输入&user、&ad了

再进一步研究:我们在C#当中,如果使用了virtual作为修饰符在父类中写了一个方法,那么在子类中通过override可以重写这个方法,最终的结果就是调用的非父类的该方法,而是子类的,Go语言同样可以。

例如

// 通过admin 类型值的指针
// 调用的方法
func (a *admin) notify() {
   fmt.Printf("Sending admin email to %s<%s>\n",
       a.name,
       a.email)
}

在刚刚的代码中,追加一个*admin作为接受者的方法。

运行结果如下:

Sending user email to john smith<john@yahoo.com>
Sending admin email to john smith<john@yahoo.com>

可以发现此时这两此运行的结果就不一样了,第二次sendNotification(&ad)调用的notify方法就是admin这个类型的了。

这表明,如果外部类型实现了notify 方法,内部类型的实现就不会被提升。不过内部类型的值一直存在,因此还可以通过直接访问内部类型的值,来调用没有被提升的内部类型实现的方法。

三、总结

综上:嵌入类型为Go语言类型提供了一种很好的扩展能力,通过内部类型的提升,使得外部类型拥有了内部类型的方法,也可以通过外部类型实现同样的方法来替代内部类型的。总体来说很像C#语言中的继承。

到此这篇关于Go语言之嵌入类型的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

您可能感兴趣的文档:

--结束END--

本文标题: Go语言之嵌入类型详解

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

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

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

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

下载Word文档
猜你喜欢
  • Go语言之嵌入类型详解
    一、什么是嵌入类型 先看如下代码: type user struct { name string email string } type admin struct ...
    99+
    2022-11-13
  • Go语言之嵌入类型是什么
    今天小编给大家分享一下Go语言之嵌入类型是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、什么是嵌入类型先看如下代码:...
    99+
    2023-07-02
  • 重学Go语言之基础数据类型详解
    目录前言布尔型数字类型整型浮点型复数字符串小结前言 Go语言有非常强大的数据类型系统,其支持的数据类型大体上可分为四类:基础数据类型、引用数据类型、接口类型、复合类型。 基础数据类型...
    99+
    2023-02-28
    Go语言基础数据类型 Go语言数据类型 Go 数据类型
  • Go语言文档解读:time.Duration类型详解
    Go语言文档解读:time.Duration类型详解时间是计算机编程中一个非常常见的概念,而在Go语言中,time包提供了丰富的时间处理函数和类型。其中,time.Duration类型是Go中用于表示持续时间的一个重要类型。本文将详细解读t...
    99+
    2023-11-04
    Go语言 timeDuration 类型详解
  • Go语言文档解读:encoding/json.Encoder类型详解
    在 Go 语言中, encoding/json 包是用于处理 JSON(JavaScript Object Notation)格式的数据的标准库。在这个库中,提供了一个 Encoder 类型,它可以将 Go 语言中的结构体或是其它数据类型编...
    99+
    2023-11-03
    Go语言 encoding/json Encoder类型
  • 详解Go语言中的数据类型及类型转换
    目录1、基本数据类型2、基础数据类型转换3、基本数据类型转为字符串4、strconv的使用5、字符串转为基础类型1、基本数据类型 数据类型有很多,先研究一下基础的,例如:布尔型、数字...
    99+
    2022-11-13
  • R语言数据类型深入详解
    R语言用来存储数据的对象包括: 向量, 因子, 数组, 矩阵, 数据框, 时间序列(ts)以及列表 意义介绍 1. 向量(一维数据): 只能存放同一类型的数据 语法: c(dat...
    99+
    2022-11-11
  • go语言中值类型和指针类型的深入理解
    golang这个语言用起来和java、 c#之类语言差不多,和c/c++差别比较大,有自动管理内存机制,省心省力。 然而,如果写golang真的按写java的习惯去写,也容易出问题,...
    99+
    2022-11-13
  • Go语言入门学习之Channel通道详解
    目录前言通道的声明通道的初始化发送和接收数据通道的关闭通道的容量与长度缓冲通道与无缓冲通道双向通道和单向通道遍历通道fibonacci 数列参考文章:总结前言 不同于传统的多线程并发...
    99+
    2022-11-13
  • Go语言类型内嵌和结构体内嵌如何使用
    这篇文章主要讲解了“Go语言类型内嵌和结构体内嵌如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言类型内嵌和结构体内嵌如何使用”吧!结构体可以包含一个或多个匿名(或内嵌)字段,即...
    99+
    2023-07-05
  • GO语言类型查询类型断言示例解析
    目录类型查询1.comma-ok断言2. switch测试类型断言类型查询 我们知道interface的变量里面可以存储任意类型的数值(该类型实现了interface)。那么我们怎么...
    99+
    2022-11-13
  • go语言字符类型byte与rune案例详解
    目录一、byte类型介绍二、rune类型介绍三、遍历含有中文(Unicode)时差异3.1、遍历打印一个字符串,当使用byte类型时:3.2、使用rune 类型来遍历字符串四、go ...
    99+
    2023-03-01
    go 字符类型 go byte rune
  • Go语言操作Excel利器之excelize类库详解
    目录前言Excelize简介安装导出 Excel 文档读取Excel文档小结前言 在开发中一些需求需要通过程序操作excel文档,例如导出excel、导入excel、向excel文档...
    99+
    2022-11-11
  • Go语言数据类型详细介绍
    目录一、Go 语言两大数据类型二、基础类型三、复合类型指针四、数组(array)五、切片(slice)六、字典/映射(map)七、通道(channel)八、结构体(struct)九、...
    99+
    2022-11-13
  • Go语言类型内嵌和结构体内嵌的具体使用
    目录内嵌结构体结构内嵌特性结构体可以包含一个或多个匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字。匿名字段本身可以是一个结构体类型,即...
    99+
    2023-05-14
    Go语言类型内嵌 Go语言结构体内嵌 Go语言 类型内嵌 结构体内嵌
  • GO语言入门学习之基本数据类型字符串
    目录字符串字符串转义符byte和rune类型修改字符串类型转换总结字符串 Go语言中的字符串以原生数据类型出现。 Go 语言里的字符串的内部实现使用UTF-8编码。 字符串的值为双引...
    99+
    2022-11-13
  • go语言数据类型之字符串string
    1.Go语言String的本质就是一个[]byte,所以他们之间可以互相转换,byte数组的长度就是字符串的长度。 func StringTest1() { str := "H...
    99+
    2022-11-13
  • 详解在Go语言中如何实现枚举类型
    目录前言Go 语言中的 “枚举类型”使用 itoa 优雅实现枚举为自定义的枚举添加方法Name()OriginalString()Values()ValueO...
    99+
    2023-05-16
    Go语言实现枚举类型 Go实现枚举类型 Go语言 枚举
  • GO语言基本类型String和Slice,Map操作详解
    目录本文大纲1、字符串StringString常用操作:获取长度和遍历字符串的strings包字符串的strconv包:2、切片Slice3、集合Map本文大纲 本文继续学习GO语言...
    99+
    2022-11-11
  • Go语言基础之Time包详解
    Time包是Go语言中用于处理时间的一个标准库。它提供了一系列函数和类型,用于获取当前时间、时间格式化、时间计算等操作。在Go语言中...
    99+
    2023-08-29
    Go语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作