Go语言面向对象编程(一)匿名字段

GO语言的基础数据类型和底层实现原理 go语言中的数据类型和时间类型的底层实现结构 阅读详情

1.Go语言面向对象编程

对于面向对象编程的支持Go语言设计的非常简洁而优雅。因为,Go语言并没有沿袭传统面向对象编程中的诸多概念,比如继承(不支持继承,尽管匿名字段的内存布局和行为类似继承,但他并不是继承)、虚函数、构造函数和析构函数、隐藏的this指针等。

尽管Go语言中没有封装、继承、多态这些概念,但同样同过别的方式实现这些特性:

  • 封装:通过方法实现
  • 继承:通过匿名字段实现
  • 多态:通过接口实现

2.匿名字段基本格式举例

一般情况下,定义结构体的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。

当匿名字段也是一个结构体的时候,那么这个结构体所拥有的全部字段被隐式地引入了当前定义的这个结构体

type Person struct {
	name string
	sex  byte
	age  int
}

type Student struct {
	Person //只有类型,没有名字,匿名字段,继承了Person的成员
	id     int
	addr   string
}

3.匿名字段初始化

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

type Student struct {
	Person //只有类型,没有名字,匿名字段,继承了Person的成员
	id     int
	addr   string
}

func main() {
	//顺序初始化
	var s1 Student = Student{Person{"wang", 'm', 18}, 1, "bj"}
	fmt.Printf("s1 = %+v\n", s1)

	//自动推导类型
	s2 := Student{Person{"wang", 'm', 18}, 1, "bj"}
	//%+v显示更加详细
	fmt.Printf("s2 = %+v\n", s2)

	//指定成员初始化,没有初始化的自动赋值为0
	s3 := Student{id: 1}
	fmt.Printf("s3 = %+v\n", s3)

	s4 := Student{Person: Person{name: "mike"}, id: 1}
	fmt.Printf("s4 = %+v\n", s4)
}

输出:

4.匿名字段成员操作

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

type Student struct {
	Person //只有类型,没有名字,匿名字段,继承了Person的成员
	id     int
	addr   string
}

func main() {
	s1 := Student{Person{"wang", 'm', 18}, 1, "bj"}
	fmt.Println(s1.name, s1.addr, s1.age, s1.id, s1.sex)

	s1.name = "go"
	s1.id = 666
	s1.addr = "sz"
	s1.age = 14
	s1.sex = 'n'
	fmt.Println(s1.name, s1.addr, s1.age, s1.id, s1.sex)

	s1.Person = Person{"yoyo", 'n', 20}
	fmt.Println(s1.name, s1.addr, s1.age, s1.id, s1.sex)
}

输出:

5.同名字段

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

type Student struct {
	Person //只有类型,没有名字,匿名字段,继承了Person的成员
	id     int
	addr   string
	name   string
}

func main() {
	var s Student
	//默认规则(就近原则),如果能在本作用域找到此成员,就操作此成员
	//如果没有找到,就找到继承的字段
	s.name = "mike"
	s.sex = 'm'
	s.age = 18
	s.addr = "bj"
	fmt.Printf("s = %+v\n", s)
	//显式调用
	s.Person.name = "yoyo" //Person的name
	fmt.Printf("s = %+v\n", s)
}

输出:

6.非结构体匿名字段

package main

import (
	"fmt"
)

type mystr string //自定义类型,给一个类型改名

type Person struct {
	name string
	sex  byte
	age  int
}

type Student struct {
	Person //只有类型,没有名字,匿名字段,继承了Person的成员
	int    //基础类型的匿名字段
	mystr
}

func main() {
	s := Student{Person{"mike", 'm', 18}, 666, "hehehe"}
	fmt.Printf("s = %+v\n", s)

	s.Person = Person{"go", 'n', 23}

	fmt.Println(s.name, s.sex, s.int, s.mystr, s.age)
	fmt.Println(s.Person, s.int, s.mystr)
}

输出:

7.结构体指针类型匿名字段

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex  byte
	age  int
}

type Student struct {
	*Person     //只有类型,没有名字,匿名字段,继承了Person的成员
	id      int //基础类型的匿名字段
	addr    string
}

func main() {
	//方法一
	s1 := Student{&Person{"mike", 'm', 18}, 666, "bj"}
	fmt.Println("s1 = ", s1)
	fmt.Println(s1.name, s1.sex, s1.age, s1.addr, s1.id)

	//方法二 先定义变量
	var s2 Student
	s2.Person = new(Person) //分配空间
	s2.name = "yoyo"
	s2.sex = 'm'
	s2.id = 666
	s2.age = 21
	s2.addr = "sz"
	fmt.Println(s2.name, s2.sex, s2.age, s2.addr, s2.id)
}

输出:

【Golang】Go语言中如何面向对象? Go语言(Golang)虽然不是一个纯粹的面向对象编程语言,但它通过结构体(Struct)、接口(Interface)等机制,提供了面向对象的编程范式。 在实际的项目开发中,使用面向对象的理念可以显著提高代码的可维护性、可扩展性和可复用性。 阅读详情

相关推荐

【go从入门到精通】匿名函数详解

函数值字面量是一种表达式,它的值被称为匿名函数。从形式上看当我们不给函数起名字的时候,可以使用匿名函数,例如:不过我们经常用下面这两种方式使用匿名函数的:1.将匿名函数赋值给一个变量,然后通过这个变量调用函数的方式来实现对匿名函数的调用。

yolo模型训练找我,AI游戏合作找我 8万+

Go 代码块与作用域,变量遮蔽问题详解

变量遮蔽问题的根本原因,就是内层代码块中声明了一个与外层代码块同名且同类型的变量,这样,内层代码块中的同名变量就会替代那个外层变量,参与此层代码块内的相关计算,我们也就说内层变量遮蔽了外层同名变量。这会导致在遮蔽内部作用域内,无法直接访问外部作用域的变量,因为编译器或解释器将优先选择内部作用域的变量,而不是外部的。变量是标识符的一种,通过以上我们知道,一个变量的作用域起始于其声明所在的代码块,并且可以一直扩展到嵌入到该代码块中的所有内层代码块,而正是这样的作用域规则,成为了滋生“变量遮蔽问题”的土壤。

淘小欣的博客 634

三菱PLC软件GX-Works2使用和循环左移指令实现流水灯程序

(2)方式2:双击打开全局软元件注释,软元件名称手动输入,如M辅助继电器输入M0、D寄存器输入D0,然后找到对应的寄存器输入自定义的功能名字即可。链接:https://pan.baidu.com/s/14ZaBIq4mBirIqfd9Ja3AiA。链接:https://pan.baidu.com/s/1nuQz1OgS8bmagPE8T-PBkQ。链接:https://pan.baidu.com/s/1oKGi_bdLN5HI4HYxSXEdlA。(1)方式1:将定义好变量功能的CSV文件导入即可。

panjinliang066333的博客 1万+

go语言基础-----06-----匿名字段、同名字段

一 匿名字段、同名字段 1 匿名字段的作用及其初始化 1)go中的匿名字段就是只有类型,没有名字。 2)匿名字段的作用:因为go没有封装、继承、多态的概念,但是go也是可以面向对象编程,因为有匿名字段。例如下面,Student通过匿名字段继承了Persion的所有成员。 实际上学过C的都知道,就是一个简单的结构体嵌套而已,只不过在go叫得高大尚了。 type Persion struct { name string sex byte age int } // 普通变量的声明有var关键字,结构体

weixin_44517656的博客 2176

robot framework循环读取excel表操作

robot framework循环读取excel表操作 1、安装excellibrary,注意python3.7版本,需安装:robotframework-excel,robotframework-excellibrary-xwfintech 注意:网上有很多excel处理的,都是基于python2.7的,还有一些对python3以上都是修改包的方式,其实都不需要,在pip官网上有python3以上的excellibrary,名称是robotframework-excellib 2.0.0,但是该包关键字不

余墨的博客 1319

下水管道损坏检测数据集总结

下水管道损坏检测数据集包含 6708 张图像,为下水管道损坏情况的检测提供了丰富的数据基础。该数据集提供了 YOLO 和 VOC 两种常见的标注方式,方便不同需求的使用者进行模型训练和研究。

crz1336768325的博客 870

【Go】面向对象 - 匿名字段、接口(转载)

【Go】面向对象 - 匿名字段、接口(转载)

449

【FF-A】第四章 Concepts

SPM的责任分为两个组件:SPM调度器(SPMD)和SPM核心(SPMC)。这两个组件都可以访问整个物理地址空间,并且是受信任的计算基础的一部分。当无需区分这两个组件时,术语SPM被使用。这些组件的责任如下所示。SPMD 位于 EL3 中,以 AArch64 或 AArch32 执行状态运行。SPMC 可以与 SPMD 共存在 EL3 中,也可以位于相邻的异常级别,即 S-EL1 或 S-EL2。SPM 在启动时初始化 EL3 LSP,并在运行时促进它们与其他端点之间的通信。

baron-周贺贺-代码改变世界ctw 1195

Go 面向对象(匿名字段)

严格意义上说,GO语言中没有类(class)的概念,但是我们可以将结构体比作为类,因为在结构体中可以添加属性(成员),方法(函数)。面向对象编程的好处比较多,我们先来说一下“继承”,所谓继承指的是,我们可能会在一些类(结构体)中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类(结构体)中,作为这些类的父类(结构体),我们可以通过如下图来理解:当然严格意义上,GO语言中是没有继承的,但是我们可以通过”匿名组合”来实现继承的效果。

weixin_47906106的博客 775

1 硬件工程师笔面试高频知识考点真题及解析——电阻

本文系统介绍了电阻的基础知识、选型要点及各类特殊电阻的应用。主要内容包括:1. 电阻选型需考虑阻值、封装、功率、精度、耐压等参数;2. 高频信号优先选用小封装电阻以减小寄生参数;3. 采样电阻需高精度、低温漂以保证测量准确性;4. 详细解析了上拉/下拉电阻、0欧电阻、磁珠等元件的特性与区别;5. 介绍了压敏电阻、热敏电阻等特殊电阻的工作原理及应用场景;6. 阐述了阻抗匹配的重要性及常见匹配方法。文章为电子工程师提供了全面的电阻选型与应用指南。

XU157303764的博客 2861

投稿前利用GPT-5.5给论文做一次深度校对,投稿命中率翻倍!

3)一致性:请对比摘要的结论与正文(如果我也提供了正文),确保完全一致。请严格检查结果部分,确保客观性:1)纯粹性检查:标出所有包含“为什么”(解释)或“这意味着什么”(暗示)的主观语句,这些应移至讨论部分。请你帮我评估讨论部分的深度:1)解释与对比:检查每一项主要结果是否都解释了原因,并引用了前人研究进行对比(一致或相悖)。我见过太多人把校对理解为检查错别字了,实际上,校对要看的远不止这个,像逻辑是否连贯、术语是否前后一致、图表有没有被正确引用等等的这些细节,往往决定了文章是秒被拒,还是能顺利进入外审。

智能AI让学术科研更容易 412

Go语言---面向对象编程-匿名字段、同名字段、方法、方法集、方法的继承与重写、方法值与方法表达式

go语言面向对象编程-匿名字段、同名字段、方法、方法集、方法的继承与重写、方法值与方法表达式

m0_73537205的博客 1751

华为MetaERP在财务模块(GL/AP/AR/FA)及子账模块效率优化、月末关账加速、与外部系统对账方面,已形成一套**“并行+实时+智能化”**的完整技术方案

华为MetaERP推出"并行+实时+智能化"技术方案,显著提升财务模块效率:1)采用三级并行策略和内存计算,使子账模块单任务处理时间从142分钟降至9分钟;2)通过并行关账架构将月末关账时间从68小时压缩至7.2小时;3)运用AI智能对账提升效率50%,并支持异步流程和区块链审计。典型场景测试显示月结耗时下降89%,CPU利用率提升116%。方案建议分阶段实施,注意依赖分析、任务粒度设计和性能监控,避免过度并行。该方案已有效解决大型集团财务处理效率低、关账慢、对账难等痛点。

金牌架构师 559

8. (go语言)面向对象编程

对于面向对象编程的支持Go 语言设计得非常简洁而优雅。因为, Go语言并没有沿袭传统面向对象编程中的诸多概念,比如`继承(不支持继承,尽管匿名字段的内存布局和行为类似继承,但它并不是继承)、虚函数、构造函数和析构函数、隐藏的this指针等。

行走的皮卡丘 748

AMBA-CHI协议详解(十)

该规范提供了一个Request Retry(请求重试)机制,确保当请求到达一个Completer 时,它要么被接受,要么被给予一个RetryAck响应,以防止阻塞REQ通道。

Crazzy_M的博客 986

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Golang 匿名字段

定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go语言支持只提供类型,而不写字段名的方式,也就是匿名字段,或称为嵌入字段。 当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段以及方法(指绑定在这个类型上的,见最后)都被隐式地引入了当前定义的这个struct。 让我们来看一个例子,让上面说的这些更具体化。 package main import...

weixin_30307921的博客 553

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Go语言匿名字段使用与注意事项

当匿名字段没有指定标签时,序列化后的结构为同级,如当匿名属性和主属性的字段标签一样时,序列化会忽略匿名属性的字段。当匿名属性和主属性的字段标签不一样时,序列化不忽略任何字段。

大灰狼的专栏 1224

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Go 语言基础之面向对象编程

Go 语言面向对象,接口

功不唐捐,玉汝于成 1339

GoLang之结构体匿名字段

GoLang之结构体匿名字段

weixin_52690231的博客 2578

【Golang之路】——结构体匿名字段

结构体可以包含一个或多个匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字。匿名字段本身可以是一个结构体类型,即结构体可以包含内嵌结构体。Go语言中的继承是通过内嵌或组合来实现的,所以可以说,在Go语言中,相比较于继承,组合更受青睐。in1 intin2 int}b intc float32}// 使用结构体字面量}通过类型outer.int。

Jack 架构师之路 1315

Go语言面向对象编程

Go语言中没有“类”的概念,通过struct来实现面向对象通常用于表达一个事物的全部或部分属性是一种自定义数据类型,可以封装多个基本数据类型本质是将零个或者多个任意类型的命名变量组合在一起的聚合数据类型每个变量叫做结构体的成员,变量名必须唯一,可用“_”补位支持使用自身指针类型成员匿名结构体,顾名思义,即没有名字的结构体,与匿名函数类似匿名结构体无须type关键字就可以直接使用,匿名结构体在创建的同时也要创建对象。

llllinuuu的博客 955

golang结构体匿名字段的妙用

先看一段简单的代码: package main import ( "fmt" ) type A struct { B m int } type B struct { n int } func (b *B) my_print() { fmt.Printf("print B.n=%d\n", b.n) } func main() { a := &A{B{2}, 3} ...

cbmljs的博客 4574

go语言学习:面向对象(匿名字段)

一、匿名字段 go支持只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段 package main import "fmt" // go支持只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段 //人 type Person struct { name string sex string age int } type Studen...

Mr_qing的博客 599

Go语言之匿名字段与组合 -《Go语言实战指南》

匿名字段就是在结构体中嵌套一个类型而不显式命名字段名。该字段的名字默认就是其类型名。

tenkofx的博客 711

Go语言匿名结构体

首先,我们需要了解什么是结构体。在 Go 语言中,结构体是一种自定义的数据类型,可以由多个字段组成。这里我们定义了一个Person结构体,它由两个字段组成,分别是Name和Age。我们可以通过以下方式来创建一个Person当我们需要在一个结构体中嵌入另一个结构体时,通常使用结构体的字段来实现。这里我们定义了两个结构体,分别是Address和Person,并且在Person结构体中嵌入了Address结构体。这样我们就可以通过等方式来访问Person结构体中的Address字段了。但是,如果我们只需要使用。

GeeCode的博客 1365

Go语言的匿名字段

Go语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段**,**称之为匿名字段或者嵌套字段。所谓匿名字段实际上是一种结构体嵌套的方式,所以也可以称作嵌套字段。这种方式可以实现组合复用,即通过匿名字段,结构体可以直接访问嵌套结构体的字段和方法,而无需通过字段名或类型进行嵌套。Go语言支持匿名字段或者嵌套字段,通过这种方式可以直接访问嵌套结构体的字段和方法。在多个嵌套类型场景下,如果多个嵌套类型存在相同的字段或者方法,则需要指定具体的类型以避免歧义。本篇完结!!!Go语言的匿名字段。

程序员半支烟,wechat:yclxiao 330
上一篇: GO语言基础(三)复合类型(指针、数组、切片、map、结构体)
下一篇: Go语言面向对象编程(二)方法
random_w
博客等级 码龄9年 130粉丝 168原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值