golang结构体嵌套和用结构体实现模拟“继承”(代码片段)

李斌的BLOG 李斌的BLOG     2023-01-06     795

关键词:

什么是结构体嵌套

一个结构体中可以嵌套包含另一个结构体或结构体指针

结构体嵌套

package main

import "fmt"

// 桌子结构体
type table struct 
	material string
	shape int
	com common // 嵌套结构体


// 被嵌套的结构体定义
type common struct 
	year int


func main() 
	// 嵌套结构体定义和输出方法
	s1 := table
		material: "木头",
		shape: 5,
		com: common
			year: 2000,
		,
	
	fmt.Println(s1.com.year)


匿名结构体嵌套

package main

import "fmt"

// 狗结构体
type dog struct 
	name string
	varieties string
	common // 嵌套匿名结构体


// 被嵌套的结构体定义
type common struct 
	year int


func main() 
	// 匿名嵌套结构体定义和输出方法
	s2 := dog
		name:      "布迪",
		varieties: "柴犬",
		common: common
			year: 2019,
		,
	
	fmt.Println(s2.year) // 直接输出
	fmt.Println(s2.common.year) // 寻址输出


当访问结构体成员时会先在结构体中查找该字段,找不到再去嵌套的匿名字段中查找。

嵌套结构体的字段名冲突

嵌套结构体内部可能存在相同的字段名。在这种情况下为了避免歧义需要通过指定具体的内嵌结构体字段名。

//Address 地址结构体
type Address struct 
	Province   string
	City       string
	CreateTime string


//Email 邮箱结构体
type Email struct 
	Account    string
	CreateTime string


//User 用户结构体
type User struct 
	Name   string
	Gender string
	Address
	Email


func main() 
	var user3 User
	user3.Name = "沙河娜扎"
	user3.Gender = "男"
	// user3.CreateTime = "2019" //ambiguous selector user3.CreateTime
	user3.Address.CreateTime = "2000" //指定Address结构体中的CreateTime
	user3.Email.CreateTime = "2000"   //指定Email结构体中的CreateTime

用结构体嵌套模拟实现“继承”

由于golang语言不支持继承 所以我用结构体嵌套实现一个简单的继承效果

例子解释:

  • 首先定义了一个动物园zoo的结构体
  • 给动物园zoo结构体定义了一个 run的方法
  • 然后定义了一个狗的结构体dog,并且在这个结构体里面匿名嵌套了 zoo 动物园结构体
  • 给狗结构体dog定义了一个 foot 的方法

要实现的是在dog结构体里调用给zoo结构体定义的方法

代码示例

package main

import "fmt"

// 动物园结构体
type zoo struct 
	name string

// zoo 的 run 方法
func (z *zoo) run()  
	fmt.Printf("这个动物的名字叫:%s \\n", z.name)


// 狗结构体
type dog struct 
	footer int
	zoo

// dog 的 foot 方法
func (d *dog) foot()  
	fmt.Printf("这个狗有 %d 条腿 \\n", d.footer)


func main() 
	s1 := &dog
		footer: 4,
		zoo: zooname: "布迪",
	
	fmt.Println(s1)
	s1.run()
	s1.foot()

&4 布迪
这个动物的名字叫:布迪
这个狗有 4 条腿 

golang之继承,多重继承(struct)

热乎的代码来了packagemainimport"fmt"/*继承一个结构体嵌到另一个结构体,称作组合匿名和组合的区别如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问匿名结构体的方法,从而实现继承如果一个struct嵌套了另一个... 查看详情

golang中级进阶(二):结构体

...构体3.结构体标签tag4.嵌套结构体和json的序列化反序列化Golang中没有“类”的概念,Golang中的结构体和其他语言中的类有点相似。和其他面向对象语言中的类相比,Golang中的结构体具有更高的扩展性和灵活性。Golang中的基础数据... 查看详情

golang面向对象编程(代码片段)

阅读目录Golang面向对象编程11struct声明和定义struct初始化方法1struct初始化方法2结构体类型指针2struct的内存布局及构造函数结构体没有构造函数,必要时需要自己实现匿名字段和嵌套3匿名字段和struct嵌套匿名结构体匿名结构... 查看详情

go基础4(代码片段)

目录一.结构体1.1结构体的定义1.1.1匿名结构体1.2结构体指针1.3结构体初始化1.4结构体内存布局1.5构造函数1.6方法和接收者1.7值和指针接收者1.8任意类型添加方法1.9结构体的匿名字段1.10结构体嵌套1.11匿名嵌套结构体1.12嵌套结构体... 查看详情

go:面向"对象"

...字母大写的方法,由于获取结构体属性的值。二、继承在golang中,如果一个结构体嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承。typeAnimalstruct Namestring AgeinttypeTa 查看详情

golang结构体组合与“多态”2021-08-06

参考技术A如:核心思想就是,外层实现接口,通过递归嵌套将被实现的接口实例置于内层,从而达到外层定义,内层使用的效果:BaseBase和Derived都是外层结构体,在它们这一层实现了F2()。ori_impl_1以及ori_impl_2都是外层结构体实... 查看详情

go语言学习——结构体的匿名字段嵌套结构体结构体的“继承”

结构体的匿名字段匿名字段默认会采用类型名作为字段名结构体体里的字段是唯一的不能冲突的一个结构体中同种类型的匿名字段只能有一个匿名字段:没有名字的字段packagemainimport"fmt"//匿名字段//字段比较少也比较简单... 查看详情

go语言学习之旅--结构体(代码片段)

...函数参数定义直接传递结构体传递结构体指针嵌套结构体golang继承golang构造函数在定义结构体之前,我们先来看看什么是类型定义和类型别名go语言类型定义类型定 查看详情

『golang』面向对象(代码片段)

我们总结一下前面看到的:Go没有类,而是松耦合的类型、方法对接口的实现。面向对象语言最重要的三个方面分别是:封装,继承和多态,在Go中它们是怎样表现的呢?Go实现面向对象的两个关键是struct和interface,结构代替类,... 查看详情

golang-struct

Golang-struct  Golang语言面向对象编程说明    1)Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。    2)Golang没有类(c... 查看详情

golang中结构体struct(代码片段)

前言这里总结的Golang笔记只适合有点编程基础的人看,比如Java往期内容:Golang学习【day1】变量、类型Golang学习,指针,循环控制相关循环结构控制、包函数的使用异常处理、数组老奶奶可以看懂的切片老奶奶可... 查看详情

golang中结构体struct(代码片段)

前言这里总结的Golang笔记只适合有点编程基础的人看,比如Java往期内容:Golang学习【day1】变量、类型Golang学习,指针,循环控制相关循环结构控制、包函数的使用异常处理、数组老奶奶可以看懂的切片老奶奶可... 查看详情

golang学习+深入-面向“对象“编程(代码片段)

...1、结构体一个程序就是一个世界,有很多对象(变量)Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。Golang没有类(class),... 查看详情

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

原文地址:http://goworldgs.com/?p=37在C语言中有一个经典的宏定义,可以将结构体struct内部的某个成员的指针转化为结构体自身的指针。下面是一个例子,通过FIELD_OFFSET宏计算结构体内一个字段的偏移,函数getT可以从一个F*的指针获... 查看详情

c语言-结构体(代码片段)

结构体结构体类型数据的定义和引用方法一.结构体类型的概念定义结构体变量定义结构体类型变量的方法引用结构体成员成员引用引用结构体数据成员的方法整体引用初始化结构体变量结构体嵌套和用指针引用结构体成员指向... 查看详情

abap开发中,结构体的继承和嵌套结构有啥区别?求赐教!

据我的理解应该没有太大的区别。ABAP不是面向对象语言,只是一种过程化语言。后来加进来的继承仅止于可以应用。没有太灵活的应用。参考技术A你是说扁平结构和纵深结构吧 查看详情

go语言基础:结构体(代码片段)

文章目录结构体类型别名和自定义类型自定义类型类型别名类型定义和类型别名的区别结构体结构体的定义结构体实例化基本实例化匿名结构体创建指针类型结构体取结构体的地址实例化结构体初始化使用键值对初始化结构体内... 查看详情

go语言基础:结构体(代码片段)

文章目录结构体类型别名和自定义类型自定义类型类型别名类型定义和类型别名的区别结构体结构体的定义结构体实例化基本实例化匿名结构体创建指针类型结构体取结构体的地址实例化结构体初始化使用键值对初始化结构体内... 查看详情