在 Go 语言中,结构体(struct)是一种用于将多个不同类型的数据组合在一起的数据结构。你提到的语法:

type RiderNode struct {
service.SimpleService
}

这是一种在结构体中嵌入另一个结构体的方式,称为匿名字段嵌入字段。这种语法有几个重要的特性和作用:

嵌入结构体的特性

  1. 匿名字段:

    • service.SimpleService 是一个匿名字段,因为它在 RiderNode 结构体中没有显式命名。
    • 匿名字段的字段名默认为其类型名,这意味着你可以通过 RiderNode 实例直接访问 SimpleService 的字段和方法。
  2. 字段和方法提升:

    • 当你在 RiderNode 结构体中嵌入 SimpleService 时,SimpleService 的所有字段和方法会被提升到 RiderNode 结构体的作用域中。
    • 这意味着你可以通过 RiderNode 实例直接调用 SimpleService 的方法,就像这些方法是 RiderNode 自己的一样。
  3. 继承和组合:

    • Go 语言没有传统面向对象语言中的继承(inheritance)概念,但通过这种嵌入字段的方式,实现了类似于继承的效果。
    • 这种方式更符合 Go 语言的组合(composition)优先于继承的设计哲学。

示例代码

下面是一个简单的示例,展示了如何使用嵌入结构体以及如何访问被嵌入的结构体的字段和方法:

package main

import (
"fmt"
) // 定义 SimpleService 结构体
type SimpleService struct {
ServiceName string
} // 为 SimpleService 定义一个方法
func (s *SimpleService) Start() {
fmt.Printf("Service %s started\n", s.ServiceName)
} // 定义 RiderNode 结构体,嵌入 SimpleService
type RiderNode struct {
SimpleService
} func main() {
// 创建 SimpleService 实例
service := SimpleService{
ServiceName: "RiderService",
} // 创建 RiderNode 实例,并嵌入 SimpleService 实例
node := RiderNode{
SimpleService: service,
} // 直接访问 SimpleService 的字段
fmt.Println("RiderNode's service name:", node.ServiceName) // 直接调用 SimpleService 的方法
node.Start()
}

代码解释

  1. 定义 SimpleService 结构体:

    • SimpleService 结构体有一个字段 ServiceName,表示服务的名称。
    • SimpleService 定义了一个方法 Start,用于启动服务。
  2. 定义 RiderNode 结构体:

    • RiderNode 结构体嵌入了 SimpleService,这意味着 RiderNode 继承了 SimpleService 的所有字段和方法。
  3. main 函数中使用 RiderNode:

    • 创建了一个 SimpleService 实例,并设置其 ServiceName 字段。
    • 创建了一个 RiderNode 实例,并将 SimpleService 实例嵌入其中。
    • 直接访问 SimpleService 的字段 ServiceName
    • 直接调用 SimpleService 的方法 Start

通过这种方式,你可以在不显式声明字段或方法的情况下,轻松地将一个结构体的功能扩展到另一个结构体。这种组合模式在 Go 语言中非常常见,用于实现模块化和可重用的代码结构。

Go 匿名字段介绍的更多相关文章

  1. 【Go入门教程4】struct类型(struct的匿名字段)

    struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器.例如,我们可以创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名和年龄.这样 ...

  2. 【Go入门教程6】struct类型(struct的匿名字段)

    struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器.例如,我们可以创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名和年龄.这样 ...

  3. GO学习笔记:struct的匿名字段

    我们上面介绍了如何定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段. 当匿名字段是一个struct的时候,那么这个 ...

  4. 初始化JQuery方法与(function(){})(para)匿名方法介绍

    一.初始化JQuery对象 DOM加载完成时运行代码 1.$(document).ready(function(){ 全写 // 在这里写你的代码... }); 2.jQuery(function() ...

  5. go之匿名字段

    struct,定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段. 当匿名字段是一个struct的时候,那么这个struct所拥有的全部字 ...

  6. sql having 函数 按匿名字段作为条件进行查询

    今天写sql 遇到一个问题 SELECT a.*, count(b.id) AS nums FROM a LEFT JOIN b ON a.id=b.a_id WHERE nums>1 这时候会 ...

  7. go语言之进阶篇结构体指针类型匿名字段

    1.结构体指针类型匿名字段 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...

  8. go语言之进阶篇非结构体匿名字段

    1.非结构体匿名字段 示例 : package main import "fmt" type mystr string //自定义类型,给一个类型改名 type Person st ...

  9. [GO]非结构体匿名字段

    package main import ( "fmt" ) type mystr string //给一个类型重命名 type Person struct { name strin ...

  10. [GO]匿名字段

    package main import ( "fmt" ) type Person struct { name string sex byte age int } type Stu ...

随机推荐

  1. AT_abc215F 题解

    考虑二分答案. 假设当前二分的答案为 \(k\),那么对于每个点,距离大于等于 \(k\) 的点构成了平面上 \(4\) 个子平面. 那么只需查询子平面中是否存在点即可,类似于窗口的星星,把问题转换成 ...

  2. Java开发工具和历史版本

    eclipse 的历史版本: 版本代号 平台版本 主要版本发行日期 SR1发行日期 SR2发行日期 SR3发行日期 代号名称 N/A 3.0 2004年6月21日 [2]  N/A N/A N/A N ...

  3. Unity 2023/Unity 6编辑器文字模糊的解决方案

    这是从2023.1开始就有的问题了.本质原因是Unity不知道哪个天才决定的在编辑器文字上使用了SDF渲染. 2023.1因为缺乏选项导致几乎不可用:2023.2加了一个锐度选项:后来在论坛里被众人喷 ...

  4. tp5命名规范

    tp5中对类,文件名,函数和方法的命名规范如下: 类名和类文件名保持一致,并统一采用驼峰法命名(首字母大写) 类的命名采用驼峰法,并且首字母大写,例如 User.UserType,不需要添加contr ...

  5. ComfyUI进阶:Comfyroll插件 (四)

    ComfyUI进阶:Comfyroll插件 (四) 前言: 学习ComfyUI是一场持久战,而Comfyroll 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业 ...

  6. Nuxt 使用指南:掌握 useNuxtApp 和运行时上下文

    title: Nuxt 使用指南:掌握 useNuxtApp 和运行时上下文 date: 2024/7/21 updated: 2024/7/21 author: cmdragon excerpt: ...

  7. Vue export & export default & import 总结

    Vue export & export default & import 总结 by:授客 QQ:1033553122 1.   实践环境 Vue 2.9.6 2.   简介 在ES6 ...

  8. C# 网络编程:.NET 开发者的核心技能

    前言 数字化时代,网络编程已成为软件开发中不可或缺的一环,尤其对于 .NET 开发者而言,掌握 C# 中的网络编程技巧是迈向更高层次的必经之路.无论是构建高性能的 Web 应用,还是实现复杂的分布式系 ...

  9. 搭建lnmp环境-php(第二步)

    系统环境:centos7 php7.4 编译安装太繁琐,这里用yum安装即可 ===========yum形式安装======== # 安装EPEL源(nginx那里已安装了,跳过) yum inst ...

  10. 新年恭喜发财-scratch编程作品

    程序说明: <新年-恭喜发财>是一个基于Scratch平台制作的动画贺卡项目.该项目通过编程和艺术设计,展现了浓厚的中国新年(2024年为龙年)氛围,以及传统的恭喜发财祝福.动画中包含有喜 ...