Go语言中匿名嵌套和类型嵌套的区别
在Go语言中,匿名嵌套结构体和与类型同名的嵌套结构体不是完全等价的,它们有一些重要的区别。以下是它们之间的主要区别:
字段访问:
- 匿名嵌套结构体:当你使用匿名嵌套结构体时,内部结构体的字段可以被直接访问,就好像它们是外部结构体的字段一样。这意味着你可以直接使用外部结构体的实例来访问内部结构体的字段,而不需要通过结构体名称。
- 与类型同名的嵌套结构体:当外部结构体和内部结构体同名时,访问内部结构体的字段需要使用结构体的名称来限定字段的访问。这是因为存在命名冲突,编译器需要知道你是在访问外部结构体还是内部结构体的字段。
字段重载:
- 匿名嵌套结构体:如果内部结构体和外部结构体具有相同的字段名称,外部结构体的字段会重载内部结构体的字段。这意味着外部结构体的字段将覆盖内部结构体的同名字段。
- 与类型同名的嵌套结构体:如果外部结构体和内部结构体同名,那么字段冲突会导致编译错误。你必须显式地使用限定符来区分它们,以解决冲突。
以下是一个示例,说明这两种情况的区别:
package main
import "fmt"
type InnerStruct struct {
Field1 int
}
type OuterStruct1 struct {
InnerStruct // 匿名嵌套
Field2 int
}
type OuterStruct2 struct {
InnerStruct InnerStruct // 与类型同名的嵌套
Field2 int
}
func main() {
obj1 := OuterStruct1{
InnerStruct: InnerStruct{Field1: 100},
Field2: 200,
}
obj2 := OuterStruct2{
InnerStruct: InnerStruct{Field1: 300},
Field2: 400,
}
fmt.Println(obj1.Field1) // 直接访问内部结构体字段,输出 100
fmt.Println(obj2.InnerStruct.Field1) // 使用限定符访问内部结构体字段,输出 300
// fmt.Println(obj2.InnerStruct.Field1) // error
}
总之,虽然匿名嵌套结构体和与类型同名的嵌套结构体都允许将一个结构体嵌套到另一个结构体中,但它们的字段访问和字段重载规则不同。你应该根据你的需求选择适当的方式来嵌套结构体。
Go语言中匿名嵌套和类型嵌套的区别的更多相关文章
- C语言中两个相同类型的结构体变量之间是可以相互直接赋值的
C语言中,在相同类型的变量间赋值时是直接内存复制的,即将他们的内存进行复制,而两个同类型的结构体变量属于同一种变量,所以赋值时是按照他们的内存分布来直接拷贝的.所以,在C语言中两个相同类型的结构体变量 ...
- 详解 Go 语言中的 time.Duration 类型
swardsman详解 Go 语言中的 time.Duration 类型swardsman · 2018-03-17 23:10:54 · 5448 次点击 · 预计阅读时间 5 分钟 · 31分钟之 ...
- C语言中变量的存储类型
在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register 寄存器变量extern 外部变量static 静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...
- [Go] gocron源码阅读-go语言中的切片和类型综合
在gocron.go文件的main函数中,有下面这一句,从这句代码中可以学习到切片和类型的综合运用 cliApp.Flags = append(cliApp.Flags, []cli.Flag{}.. ...
- c 语言中宏定义和定义全局变量的区别
宏定义和定义全局变量的区别: 1 作用时间不同. 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以. 2 本质类型不同. 宏定义的只是一段字符,在编译的时候被替换到引用的位置.在运行中是没有 ...
- c语言中(*p)[n]和*p[n]的区别
写于2016年12月5日. c语言中(*p)[n]表示的数组指针,在该表达式中按照运算的优先级,首先计算()的中*p,在和[n]计算.含义为指向含有n个元素的一维数组. *p[n]表示的是指针数组,在 ...
- c语言中的数据变量类型,大小
C中有哪些数据类型? 回答: 有两种类型的数据类型,用户定义和预定义.预定义的数据类型是int,char,float,double等,用户使用标签struct,union或enum创建用户定义的数据类 ...
- JS中匿名函数$(function(){ })和(function(){})()的区别
“$(function(){ });” Jquery语法的匿名函数,用于存放操作DOM对象的代码,执行其中代码时DOM对象已存在: (通过这样就可以在页面加载完成时通过ajax再异步加载一些数据) “ ...
- java语言中一些使用的小技巧(区别于c++)
正在自学java中...想记录下java和c++在一些小的方面的不同点.(未完待续...) java中class的对象均是引用类型的,如果想把连个同类型的对象相关联起来,只要将一个赋值给另一个就可以了 ...
- C语言中指针数组和数组指针的区别
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称. 数组指针:首先它是一个指针,它指向一个数组.在32 位系统下永远是占4 个字节,至于它指 ...
随机推荐
- 为什么要重写equals要重写hashcode方法
Java 比较(==, equals) 一.= = ==:比较两个对象的引用是否是同一个地址 二.equals object中equals方法调用的就是==,可以在其他类中重写该方法. 三.为什么要重 ...
- 解决Springboot项目打成jar包后获取resources目录下的文件失败的问题
前几天在项目读取resources目录下的文件时碰到一个小坑,明明在本地是可以正常运行的,但是一发到测试环境就报错了,说找不到文件,报错信息是:class path resource [xxxx] c ...
- 怎样优雅地增删查改(一):从0开始搭建Volo.Abp项目
@ 目录 项目介绍 模块化 由框架实现的 需要实现的 创建项目 创建业务模块 配置引用和依赖 配置DbContext 创建实体和Dto 配置AutoMapper 软件系统中数据库或者持久层的基本操作功 ...
- 零基础实现Java直播(一):集成
从泛娱乐的秀场直播,到直播带货潮流中的电商直播,直播已经成为2020年最热的应用技术之一,越来越多的产品希望加入直播功能.下面我们基于即构Express Video SDK,来分享如何从零实现线上直播 ...
- 2023年ccpc河南省程序设计竞赛-clk
很荣幸能够参加这次比赛,比赛机会挺难得得,还是第一次线下参加这样的大型比赛,比赛体验自然无话可说比较刺激..这次比赛我和队友crf和nhr共同解决了三道题,参与感极差,可以说问题很大,最简单的签到题我 ...
- 使用Stable Diffusion制作AI数字人视频的简明教程
基本方法 搞一张照片,搞一段语音,合成照片和语音,同时让照片中的人物动起来,特别是头.眼睛和嘴. 语音合成 语音合成的方法很多,也比较成熟了,大家可以选择自己方便的,直接录音也可以,只要能生成一个语音 ...
- Redis从入门到放弃(1):安装配置
1. 介绍 Redis是一个高性能的开源key-value数据库.它被广泛应用于缓存.会话存储.实时分析.消息队列等场景.Redis具有以下三个主要特点: 数据持久化:Redis支持将内存中的数据保存 ...
- openpyxl 设置单元格自动换行
解决方案 openpyxl的alignment函数中的参数:wrapText=True,就可以了 from openpyxl.styles import Alignment worksheet.cel ...
- 一文搞懂TCP的三次握手和四次挥手
目录 1.三次握手 2.四次挥手 3.11种状态名词解析 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开. 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所 ...
- Linq开发技巧与业务逻辑校验
Linq 是一种基于 .NET Framework 的编程语言,它的出现极大地提高了开发效率.Linq 提供了一种统一的查询语法,使得开发人员可以使用一种语言来查询不同类型的数据源,包括对象.集合.数 ...