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

Posted 李斌的BLOG

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go结构体嵌套和用结构体实现模拟“继承”相关的知识,希望对你有一定的参考价值。

什么是结构体嵌套

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

结构体嵌套

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 条腿 

以上是关于go结构体嵌套和用结构体实现模拟“继承”的主要内容,如果未能解决你的问题,请参考以下文章

Go基础4

Go基础4

Go基础4

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

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

Go:面向"对象"