Go 匿名字段介绍
在 Go 语言中,结构体(struct)是一种用于将多个不同类型的数据组合在一起的数据结构。你提到的语法:
type RiderNode struct {
service.SimpleService
}
这是一种在结构体中嵌入另一个结构体的方式,称为匿名字段或嵌入字段。这种语法有几个重要的特性和作用:
嵌入结构体的特性
匿名字段:
service.SimpleService是一个匿名字段,因为它在RiderNode结构体中没有显式命名。- 匿名字段的字段名默认为其类型名,这意味着你可以通过
RiderNode实例直接访问SimpleService的字段和方法。
字段和方法提升:
- 当你在
RiderNode结构体中嵌入SimpleService时,SimpleService的所有字段和方法会被提升到RiderNode结构体的作用域中。 - 这意味着你可以通过
RiderNode实例直接调用SimpleService的方法,就像这些方法是RiderNode自己的一样。
- 当你在
继承和组合:
- 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()
}
代码解释
定义
SimpleService结构体:SimpleService结构体有一个字段ServiceName,表示服务的名称。- 为
SimpleService定义了一个方法Start,用于启动服务。
定义
RiderNode结构体:RiderNode结构体嵌入了SimpleService,这意味着RiderNode继承了SimpleService的所有字段和方法。
在
main函数中使用RiderNode:- 创建了一个
SimpleService实例,并设置其ServiceName字段。 - 创建了一个
RiderNode实例,并将SimpleService实例嵌入其中。 - 直接访问
SimpleService的字段ServiceName。 - 直接调用
SimpleService的方法Start。
- 创建了一个
通过这种方式,你可以在不显式声明字段或方法的情况下,轻松地将一个结构体的功能扩展到另一个结构体。这种组合模式在 Go 语言中非常常见,用于实现模块化和可重用的代码结构。
Go 匿名字段介绍的更多相关文章
- 【Go入门教程4】struct类型(struct的匿名字段)
struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器.例如,我们可以创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名和年龄.这样 ...
- 【Go入门教程6】struct类型(struct的匿名字段)
struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器.例如,我们可以创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名和年龄.这样 ...
- GO学习笔记:struct的匿名字段
我们上面介绍了如何定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段. 当匿名字段是一个struct的时候,那么这个 ...
- 初始化JQuery方法与(function(){})(para)匿名方法介绍
一.初始化JQuery对象 DOM加载完成时运行代码 1.$(document).ready(function(){ 全写 // 在这里写你的代码... }); 2.jQuery(function() ...
- go之匿名字段
struct,定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段. 当匿名字段是一个struct的时候,那么这个struct所拥有的全部字 ...
- sql having 函数 按匿名字段作为条件进行查询
今天写sql 遇到一个问题 SELECT a.*, count(b.id) AS nums FROM a LEFT JOIN b ON a.id=b.a_id WHERE nums>1 这时候会 ...
- go语言之进阶篇结构体指针类型匿名字段
1.结构体指针类型匿名字段 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...
- go语言之进阶篇非结构体匿名字段
1.非结构体匿名字段 示例 : package main import "fmt" type mystr string //自定义类型,给一个类型改名 type Person st ...
- [GO]非结构体匿名字段
package main import ( "fmt" ) type mystr string //给一个类型重命名 type Person struct { name strin ...
- [GO]匿名字段
package main import ( "fmt" ) type Person struct { name string sex byte age int } type Stu ...
随机推荐
- 算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今日 216/10000 抱个拳,送个礼 神经网络设计与选择 参数初始化与优化 学习率 ...
- 实用!一键生成数据库文档的神器,支持MySQL/SqlServer/Oracle多种数据库
Screw(螺丝钉)是一款简洁好用的数据库表结构文档生成工具,它的特点是:简洁.轻量.设计良好.多数据库支持.多种格式文档.灵活扩展以及支持自定义模板,对于有经常要进行数据库设计.评审.文档整理等需求 ...
- 咬文嚼图式的介绍二叉树、B树/B-树
前言 因为本人天资愚钝,所以总喜欢将抽象化的事务具象化表达.对于各类眼花缭乱的树,只需要认知到它们只是一种数据结构,类似数组,切片,列表,映射等这些耳熟能详的词汇.对于一个数据结构而言,无非就是增删改 ...
- TypeScript 学习笔记 — 类型推断和类型保护(十一)
目录 类型推断 1.赋值推断 2.返回值推断 3.函数推断(反向推断) 4.属性推断 5.类型反推 6.索引访问操作符 7.类型映射 类型保护 1.typeof 类型保护 2.instanceof 类 ...
- 引入样式在Element UI (Vue 2)和Element Plus (Vue 3)中的不同
引入样式 Element UI (Vue 2): import 'element-ui/lib/theme-chalk/index.css'; Element Plus (Vue 3): im ...
- let 和 const 是 JavaScript 中用于声明变量的关键字
let 和 const 是 JavaScript 中用于声明变量的关键字. let 关键字用于声明可变(可重新赋值)的变量.通过使用 let 关键字声明的变量可以在其作用域内被重新赋值.例如: let ...
- [oeasy]python0092_homebrew_家酿俱乐部_比尔盖茨_保罗艾伦
编码进化 个人电脑 intel 8080 的出现 让 人人都 可能有 一台计算机 Ed Robert 的 创业之路 从 售卖 diy 组装配件 到进军 计算器市场 计算器 毕竟不是 个人计算机 这计算 ...
- mybatis关于大于小于:元素内容必须由格式正确的字符数据或标记组成。
首先是原因: mybatis中< >这两个符号会被识别为标签的开始和结束,用了就会报解析的错误 会报错类似下面这些 1.元素内容必须由格式正确的字符数据或标记组成. 2.Error cre ...
- SptingBoot同时接收文件和对象数据(接收表单数据)
emmm...虽然很简单,而且网上全是教程,但是自己做个笔记映像才会更深刻,还请各位前辈多多指教: @RequestMapping(value = "/eventPush", me ...
- 15、Spring之基于xml的声明式事务
阅读本文前,建议先阅读Spring之基于注解的声明式事务 15.1.环境搭建 创建名为spring_transaction_xml的新module,过程参考13.1节 15.1.1.配置打包方式和依赖 ...