在Go语言中,匿名嵌套结构体和与类型同名的嵌套结构体不是完全等价的,它们有一些重要的区别。以下是它们之间的主要区别:

  1. 字段访问:

    • 匿名嵌套结构体:当你使用匿名嵌套结构体时,内部结构体的字段可以被直接访问,就好像它们是外部结构体的字段一样。这意味着你可以直接使用外部结构体的实例来访问内部结构体的字段,而不需要通过结构体名称。
    • 与类型同名的嵌套结构体:当外部结构体和内部结构体同名时,访问内部结构体的字段需要使用结构体的名称来限定字段的访问。这是因为存在命名冲突,编译器需要知道你是在访问外部结构体还是内部结构体的字段。
  2. 字段重载:

    • 匿名嵌套结构体:如果内部结构体和外部结构体具有相同的字段名称,外部结构体的字段会重载内部结构体的字段。这意味着外部结构体的字段将覆盖内部结构体的同名字段。
    • 与类型同名的嵌套结构体:如果外部结构体和内部结构体同名,那么字段冲突会导致编译错误。你必须显式地使用限定符来区分它们,以解决冲突。

以下是一个示例,说明这两种情况的区别:

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语言中匿名嵌套和类型嵌套的区别的更多相关文章

  1. C语言中两个相同类型的结构体变量之间是可以相互直接赋值的

    C语言中,在相同类型的变量间赋值时是直接内存复制的,即将他们的内存进行复制,而两个同类型的结构体变量属于同一种变量,所以赋值时是按照他们的内存分布来直接拷贝的.所以,在C语言中两个相同类型的结构体变量 ...

  2. 详解 Go 语言中的 time.Duration 类型

    swardsman详解 Go 语言中的 time.Duration 类型swardsman · 2018-03-17 23:10:54 · 5448 次点击 · 预计阅读时间 5 分钟 · 31分钟之 ...

  3. C语言中变量的存储类型

    在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register   寄存器变量extern 外部变量static   静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...

  4. [Go] gocron源码阅读-go语言中的切片和类型综合

    在gocron.go文件的main函数中,有下面这一句,从这句代码中可以学习到切片和类型的综合运用 cliApp.Flags = append(cliApp.Flags, []cli.Flag{}.. ...

  5. c 语言中宏定义和定义全局变量的区别

    宏定义和定义全局变量的区别: 1 作用时间不同. 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以. 2 本质类型不同. 宏定义的只是一段字符,在编译的时候被替换到引用的位置.在运行中是没有 ...

  6. c语言中(*p)[n]和*p[n]的区别

    写于2016年12月5日. c语言中(*p)[n]表示的数组指针,在该表达式中按照运算的优先级,首先计算()的中*p,在和[n]计算.含义为指向含有n个元素的一维数组. *p[n]表示的是指针数组,在 ...

  7. c语言中的数据变量类型,大小

    C中有哪些数据类型? 回答: 有两种类型的数据类型,用户定义和预定义.预定义的数据类型是int,char,float,double等,用户使用标签struct,union或enum创建用户定义的数据类 ...

  8. JS中匿名函数$(function(){ })和(function(){})()的区别

    “$(function(){ });” Jquery语法的匿名函数,用于存放操作DOM对象的代码,执行其中代码时DOM对象已存在: (通过这样就可以在页面加载完成时通过ajax再异步加载一些数据) “ ...

  9. java语言中一些使用的小技巧(区别于c++)

    正在自学java中...想记录下java和c++在一些小的方面的不同点.(未完待续...) java中class的对象均是引用类型的,如果想把连个同类型的对象相关联起来,只要将一个赋值给另一个就可以了 ...

  10. C语言中指针数组和数组指针的区别

    指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称. 数组指针:首先它是一个指针,它指向一个数组.在32 位系统下永远是占4 个字节,至于它指 ...

随机推荐

  1. Linux常用磁盘管理命令详解

    du du命令用于查看文件和目录磁盘的使用空间. 命令语法:du [参数] [文件或目录名称] 参数说明: 参数 说明 -a 列出所有的文件与目录容量. -h 以G.M.K为单位,返回容量. -s 列 ...

  2. .net 搜索联想词

    思路: 1.ajax请求后台方法获取数据. 2.通过jquery将请求到的数据显示在页面上. 前台 <div class="sc_con" id="bbsearch ...

  3. ShowMeBug 持续升级,提供高信效度支撑的技术招聘方案

    去年年底,全新升级版的 ShowMeBug --一款支持实战编程的技术能力评估平台,首次揭开了它神秘的面纱. 而近日,ShowMeBug 再次迎来一系列产品更新,它将以全新的面貌,提供高信效度支撑的技 ...

  4. Docker 的安装及常用命令

    CentOS Docker 安装 参看链接 Windows安装 Docker Desktop 官方下载地址: https://hub.docker.com/editions/community/doc ...

  5. Galaxy Project 是一个开源的生物医学分析平台项目。在 Github 的 #8475 上有个讨论,可以动态开启 message_box_content, admin_users, w......

    本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...

  6. 2023安洵杯web两道WP

    Web CarelessPy 在首页提示存在eval和login的路由,在download存在任意文件下载 访问eval可以读取目录下的文件,知道/app/pycache/part.cpython-3 ...

  7. Tab切换以及倒计时组件封装

    1.Tab组件 功能 支持默认选中tab 子元素可以是文本或者图片 自定义tab的数量,并自适应展示 实现方式 用ul > li标签遍历传入的tabs数组参数渲染 判断是否传入背景,未传则显示文 ...

  8. To ChatGPT:让你更加随意地使用所有ChatGPT应用

    现在其实已经有很多在线的llm服务了,当然也存在许多开源部署方案,但是不知道大家有没有发现一个问题,目前基于ChatGPT开发的应用,都是使用的OpenAI的接口.换句话说,如果没有OpenAI账号, ...

  9. Pinot2:一款强大的无人机操作系统

    目录 1. 引言 1.1. 背景介绍 1.2. 文章目的 1.3. 目标受众 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍 2.3. 相关技术比较 3. 实现步骤与流程 3.1 ...

  10. 4大数据实战系列-hive安装配置优化

    1 基础环境 1.1 版本预览 Cnetos 6.5 已安装 Hadoop 2.8 已安装集群 Hive 2.3 待安装 Mysql 5.6 已安装 Spark 2.1.1 已安装 1.2 机器环境 ...