内嵌结构体

结构体可以包含一个或多个匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字。匿名字段本身可以是一个结构体类型,即结构体可以包含内嵌结构体。

golang语言中的继承是通过内嵌或组合来实现的,所以可以说,在Go语言中,相比较于继承,组合更受青睐。

package mainimport "fmt"type innerS struct {in1 intin2 int
}type outerS struct{b intc float32int           //匿名字段innerS       // 匿名字段
}func main() {outer := new(outerS)outer.b = 6outer.c = 7.5outer.int = 60outer.in1 = 5outer.in2 = 10fmt.Printf("outer.b is: %d\n", outer.b)fmt.Printf("outer.c is: %f\n", outer.c)fmt.Printf("outer.int is: %d\n", outer.int)fmt.Printf("outer.in1 is: %d\n", outer.in1)fmt.Printf("outer.in2 is: %d\n", outer.in2)outer2 := outerS{b:      6,c:      7.5,int:    1,innerS: innerS{5,10,},}fmt.Println(outer2)
}

  • 通过类型 outer.int 的名字来获取存储在匿名字段中的数据,于是可以得出一个结论:在一个结构体中对于每一种数据类型只能有一个匿名字段。
  • 同样地结构体也是一种数据类型,所以它也可以作为一个匿名字段来使用,如同上面例子中那样。外层结构体通过 outer.in1 直接进入内层结构体的字段,内嵌结构体甚至可以来自其他包。内层结构体被简单的插入或者内嵌进外层结构体。这个简单的“继承”机制提供了一种方式,使得可以从另外一个或一些类型继承部分或全部实现。

结构内嵌特性

Go语言的结构体内嵌有如下特性。

  1. 内嵌的结构体可以直接访问其成员变量

嵌入结构体的成员,可以通过外部结构体的实例直接访问。如果结构体有多层嵌入结构体,结构体实例访问任意一级的嵌入结构体成员时都只用给出字段名,而无须像传统结构体字段一样,通过一层层的结构体字段访问到最终的字段。例如,ins.a.b.c的访问可以简化为ins.c。

  1. 内嵌结构体的字段名是它的类型名

内嵌结构体字段仍然可以使用详细的字段进行一层层访问,内嵌结构体的字段名就是它的类型名,代码如下:

var c Color
c.BasicColor.R = 1
c.BasicColor.G = 1
c.BasicColor.B = 0

一个结构体只能嵌入一个同类型的成员,无须担心结构体重名和错误赋值的情况,编译器在发现可能的赋值歧义时会报错。

golang:结构体内嵌结构体相关推荐

  1. c语言结构体内嵌结构体指针_C语言中的结构指针

    c语言结构体内嵌结构体指针 Prerequisite: 先决条件: Structures in C programming language. C编程语言中的结构. Dynamic Memory al ...

  2. Go语言学习-- No.11结构体--结构体内嵌

    结构体内嵌 结构体内嵌 结构体内嵌的初始化 结构体内嵌 Go语言的结构体内嵌是一种组合特性,使用结构体内嵌可构建一种面向对象编程思想中的继承关系. 结构体实例化后,可直接访问内嵌结构体的所有成员变量和 ...

  3. Go 学习笔记(33)— Go 自定义类型 type(自定义结构体、结构体初始化、结构体内嵌、自定义接口)

    1. 自定义类型格式 用户自定义类型使用关键字 type ,其语法格式是: type newType oldType oldType 可以是自定义类型.预声明类型.未命名类型中的任意一种. newTy ...

  4. C++之指针探究(十七):结构体内嵌函数指针实现分层

    相关博文:C++之指针探究(十三):函数指针数组 相关博文:C++之指针探究(十二):指针.下标.数组及其作函数参数探究 相关博文:C++之指针探究(十一):函数名的本质和函数指针 相关博文:C++之 ...

  5. 结构体内嵌比较函数bool operator (const node x) const {}

    直接看别人的链接 [http://www.cnblogs.com/ZERO-/p/9347296.html] 转载于:https://www.cnblogs.com/mch5201314/p/9978 ...

  6. 换个语言学一下 Golang (9)——结构体和接口

    换个语言学一下 Golang (9)--结构体和接口 基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就 ...

  7. c语言 char转int_图文并茂,一文讲透C语言结构体内存对齐

    ↑点击上方蓝色字体,关注"嵌入式软件实战派"获得更多精品干货. (以下有约5000字内容,建议收藏再读,推荐下载源码自行测试以加深理解.) 面试官:你知道C语言的结构体对齐吗? 应 ...

  8. golang map嵌套struct 结构体字段 不能直接修改 解决方法

    目录 错误信息 错误原因 解决方法 错误信息 Reports assignments directly to a struct field of a map 错误原因 结构体作为map的元素时,不能够 ...

  9. 在Golang里如何实现结构体成员指针到结构体自身指针的转换

    原文地址:http://goworldgs.com/?p=37 在C语言中有一个经典的宏定义,可以将结构体struct内部的某个成员的指针转化为结构体自身的指针.下面是一个例子,通过FIELD_OFF ...

最新文章

  1. Python全栈工程师(多继承、函数重写)
  2. IIS 的负载均衡【IIS7.0以上才可以使用】---- Application Request Routing(ARR)
  3. 【Java】Integer.valueOf()
  4. python中提取几列_Python一键提取PDF中的表格到Excel(实例50)
  5. 企业如何建设BI商业智能系统
  6. Spring 事务管理tx,aop
  7. PouchContainer 开源版本及内部版本一致性实践
  8. AspectJ中5种类型的增强注解有什么区别?
  9. Bootstrap框架---Uploadify插件----多张图片上传交互方式一
  10. Autumn源码解读
  11. 坯子库和suapp哪个好用_关于Sketchup插件安装使用,你应该知道的那些事
  12. Android安卓仿IOS音量调节-自定义view系列(4)
  13. 【前置句与倒装句练习题】否定词放句首的倒装
  14. 浏览器开发者模式获取页面元素
  15. 如何将传统 Web 框架部署到 Serverless
  16. 微信彩蛋表情雨秘笈大全
  17. DNS代理的搭建方式以及解析方式设定
  18. Oracle-存储过程ppt讲解
  19. IT30:新门店开业前IT准备工作!
  20. Qt常用控件介绍(一)

热门文章

  1. 哥德尔定理的正规表述
  2. Ubuntu 18.04安装ROS Melodic
  3. 【转自oschina网站】Hadoop、Pig、Hive、Storm、NOSQL 学习资源收集
  4. IntelliJ IDEA 字体设置
  5. 敖包相会:CECS三工作组联欢贺新年
  6. 计算机一级考试ps知识点,计算机一级考试PS备考复习题及答案2017
  7. python对市场营销的认识和理解_我对市场营销的认识
  8. JAVA树状结构转List平面
  9. 文言文编程可以编译成PHP吗,人人都可以学会编译原理-开篇
  10. Java使用JaxWsDynamicClientFactory和HttpURLConnection调取Webservice接口