9.13Go之结构体之类型内嵌和结构体内嵌
时间:2021-09-13
本文章向大家介绍9.13Go之结构体之类型内嵌和结构体内嵌,主要包括9.13Go之结构体之类型内嵌和结构体内嵌使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
类型内嵌和结构体内嵌的含义
概念:
-
结构体可以包含一个或多个匿名(或内嵌)字段--->这些字段没有显式的名字,只有字段的类型
-
类型也就是字段的名字。匿名字段本身可以是一个结构体类型,即结构体可以包含内嵌结构体。
这个概念在C当中也是一样的,这样的概念类似于Java当中的类的继承机制。可以使用父类的属性和公开的方法
示例代码:
需求:
-
实现一个结构体
-
实现另一个结构体,内嵌第一个结构体和一个匿名结构体
-
实例化第二个结构体来访问第一个结构体当中的成员并且初始化他们
package main
import "fmt"
/*
定义一个内嵌结构体
*/
type inner struct {
num1 int
num2 int
}
/*
定义另一个外部结构体嵌入内嵌结构体
*/
type outer struct {
num3 int
num4 float64
//匿名结构体
int
//内嵌结构体
inner
}
func main() {
//实例化外部结构体
outer1 := new(outer)
//访问变量并且选择性的初始化
outer1.num3 = 30
outer1.int = 80
outer1.num1 = 20 //这个成员在inner当中
outer1.num2 = 30 //这个成员在inner当中
//打印结果
fmt.Printf("outer.num3 is:%d\n", outer1.num3)
fmt.Printf("outer.int is:%d\n", outer1.int)
fmt.Printf("outer.num1 is:%d\n", outer1.num2)
fmt.Printf("outer.num2 is:%d\n", outer1.num2)
fmt.Println("############################")
//使用结构体字面量赋值
outer2 := outer{6, 3.14, 60, inner{5, 8}}
fmt.Printf("outer2 is:", outer2)
}
内嵌结构体
概念:
-
是一种数据类型,可以作为一个匿名字段来使用
-
外层结构体的实例可以直接进入内层结构体当中--->类似于继承的概念
可以从另外一个或一些类型继承部分或全部实现
示例代码:
package main
import "fmt"
/*
定义一个内嵌结构体
*/
type inner struct {
num1 int
num2 int
}
/*
定义另一个外部结构体嵌入内嵌结构体
*/
type outer struct {
num3 int
num4 float64
//匿名结构体
int
//内嵌结构体
inner
}
结构内嵌特性
-
内嵌的结构体可以直接访问其成员变量
-
嵌入结构体的成员,可以通过外部结构体的实例直接访问
-
如果有多层可以层层访问--->一次
.
下去
-
-
内嵌结构体的字段名是它的类型名
-
示例代码:
-
var c Color
c.BasicColor.R = 1
c.BasicColor.G = 1
c.BasicColor.B = 0
-
注意:
-
一个结构体只能嵌入一个同类型的成员,编译器在发现可能的赋值歧义时会报错。
构体内嵌模拟类的继承
概念:
-
面向对象思想中,实现对象关系需要使用“继承”特性。例如,人类不能飞行,鸟类可以飞行。人类和鸟类都可以继承自可行走类,但只有鸟类继承自飞行类。
-
java
或者c#
从语言设计层面就禁止了多继承机制
Go语言的结构体内嵌特性就是一种组合特性
可以快速构建对象的不同特性
示例代码:
package main
import "fmt"
/*
定义一个飞行结构体--->和Java当中定义类不一样,是一种存在于类之上的抽象的东西
*/
type Flying struct {
}
/*
定义这个飞行结构体能够拥有的方法--->类似于Java中类的方法
由于结构体当中的特性,结构体当中只能够定义成员不能够定义函数
*/
func (f *Flying) Fly() {
fmt.Println("can fly")
}
/*
定义一个可行走的结构体--->行走类
*/
type Walking struct {
}
/*
定义这个行走结构体当中的方法
*/
func (w *Walking) Walk() {
fmt.Println("can walk")
}
/*
定义人类,人类能够行走不能飞--->到这里定义的人类的结构体才是类似于Java当中的类
内嵌的结构体相当于类当中的方法。只是Go当中使用了另外一种展现了面向对象的思想
*/
type Human struct {
Walking
}
/*
定义鸟类
*/
type Bird struct {
Flying
Walking
}
func main() {
//实例化人类
hu := new(Human)
fmt.Println("Human is:")
hu.Walk() //访问到内嵌结构体当中的方法
fmt.Println("##########")
//实例化鸟类
br := new(Bird)
fmt.Println("Bird is:")
br.Fly()
br.Walk()
}
注意:
It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/15264571.html
- 那些年我们的(具有含金量)MySQL测试题目
- Java 异常处理之 论 finally块何时候不走
- Java 中的异常处理机制
- Java 关于接口的那点事儿
- 论 Java 中的内存分配
- Javascript基础回顾 之(一) 类型
- Javascript基础回顾 之(三) 面向对象
- Javascript基础回顾 之(二) 作用域
- 一不小心写了个WEB服务器
- 遍历算法(1)
- Membership三步曲之入门篇 - Membership基础示例
- Java-String.intern的深入研究
- 从Membership 到 .NET4.5 之 ASP.NET Identity
- Membership三步曲之进阶篇 - 深入剖析Provider Model
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 计算CNN卷积神经网络中各层的参数数量「附代码」
- C++ 万字长文第一篇---拿下字节面试
- 家国梦自动收取金币、货物、升级建筑、拆相册等脚本
- matplotlib 设置移动边框
- 发布你的第一个nodejs c++插件
- nodejs多线程的探索和实践
- 3分钟短文 | Laravel 检验关联模型是否存在的2个必知必会方法
- python读取ini配置的类封装
- ESP32蓝牙的Gatt Client的例子演练
- 3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?
- 3分钟短文 | Laravel 内3种数据校验的写法,你喜欢哪一个?
- 纯JavaScript实现的MQTT智能门锁
- 3分钟短文 | Laravel 灵活地获取当前请求的路由地址
- 云原生安全 | docker容器逃逸
- 字节数组X中存放着 0~F共16个十六进制数,请将这些数以十六进制形式显示在屏幕上。