go语言中嵌套结构体的实现

 更新时间:2024年09月26日 11:29:20   作者:阿贾克斯的黎明  
在Go语言中,嵌套结构体可定义为一个结构体内包含另一个结构体,嵌套可以是值嵌套或指针嵌套,两者在内存分配和修改影响上有显著区别,本文就来详细的介绍一下,感兴趣的可以了解一下

在 Go 语言中,嵌套结构体是指在一个结构体内部定义另一个结构体。

例如:

type InnerStruct struct {
    Field1 int
    Field2 string
}

type OuterStruct struct {
    Inner InnerStruct
}

在上述示例中,`OuterStruct` 结构体嵌套了 `InnerStruct` 结构体。

当嵌套结构体中带有 `*` 时,表示是指针嵌套;不带 `*` 时,表示是值嵌套。

区别主要在于内存分配和修改的影响范围:

1. 内存分配:
    - 值嵌套:在包含结构体实例化时,会为嵌套的结构体分配内存空间,并复制其值。
    - 指针嵌套:只会为指针分配内存空间,实际的嵌套结构体数据在其他地方分配。

2. 修改影响:
    - 值嵌套:修改包含结构体中的嵌套结构体的值,不会影响到其他使用相同嵌套结构体类型的结构体实例中的值。
    - 指针嵌套:通过指针修改嵌套结构体的值,所有指向同一嵌套结构体的指针看到的值都会改变。

例如:

package main

import "fmt"

type InnerStruct struct {
    Value int
}

type OuterStruct1 struct {
    Inner InnerStruct
}

type OuterStruct2 struct {
    Inner *InnerStruct
}

func modifyValue1(outer OuterStruct1) {
    outer.Inner.Value = 100 
    // 这里的修改不会影响到传入前的 outer 实例
}

func modifyValue2(outer OuterStruct2) {
    outer.Inner.Value = 100 
    // 这里的修改会影响到传入前指向同一 InnerStruct 实例的所有指针
}

func main() {
    inner := &InnerStruct{Value: 50}

    outer1 := OuterStruct1{Inner: *inner}
    modifyValue1(outer1)
    fmt.Println(outer1.Inner.Value) 

    outer2 := OuterStruct2{Inner: inner}
    modifyValue2(outer2)
    fmt.Println(outer2.Inner.Value) 
}

到此这篇关于go语言中嵌套结构体的实现的文章就介绍到这了,更多相关go语言 嵌套结构体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 详解Golang中channel的实现

    详解Golang中channel的实现

    channel俗称管道,用于数据传递或数据共享,其本质是一个先进先出的队列,使用goroutine+channel进行数据通讯简单高效,同时也线程安全,本文就给大家讲讲Golang中channel的实现,需要的朋友可以参考下
    2023-09-09
  • Golang如何调用Python代码详解

    Golang如何调用Python代码详解

    这篇文章主要给大家介绍了关于Golang如何调用Python代码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • 手把手教你如何在Goland中创建和运行项目

    手把手教你如何在Goland中创建和运行项目

    欢迎来到本指南!我们将手把手地教您在Goland中如何创建、配置并运行项目,通过简单的步骤,您将迅速上手这款强大的集成开发环境(IDE),轻松实现您的编程梦想,让我们一起开启这段精彩的旅程吧!
    2024-02-02
  • go gin中间件关于 c.next()、c.abort()和return的使用小结

    go gin中间件关于 c.next()、c.abort()和return的使用小结

    中间件的执行顺序是按照注册顺序执行的,中间件可以通过 c.abort() + retrurn 来中止当前中间件,后续中间件和处理器的处理流程, 这篇文章给大家介绍go gin中间件关于 c.next()、c.abort()和return的使用小结,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • 用gin开发的golang项目三种开发模式方式

    用gin开发的golang项目三种开发模式方式

    这篇文章主要介绍了用gin开发的golang项目三种开发模式方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 一文理解Go 中的可寻址和不可寻址

    一文理解Go 中的可寻址和不可寻址

    如果字典的元素不存在,则返回零值,而零值是不可变对象,如果能寻址问题就大了。而如果字典的元素存在,考虑到 Go 中 map 实现中元素的地址是变化的,这意味着寻址的结果也是无意义的。下面我们就围绕这个话题写一篇文章吧,需要的朋友可以参考一下
    2021-10-10
  • Golang基础学习之map的示例详解

    Golang基础学习之map的示例详解

    哈希表是常见的数据结构,有的语言会将哈希称作字典或者映射,在Go中,哈希就是常见的数据类型map,本文就来聊聊Golang中map的相关知识吧
    2023-03-03
  • Go 1.18新特性之泛型的全面讲解

    Go 1.18新特性之泛型的全面讲解

    本文力求能让未接触过泛型编程的人也能较好理解Go的泛型,所以行文可能略显啰嗦。但是请相信我,看完这篇文章你能获得对Go泛型非常全面的了解
    2023-03-03
  • Go语言的方法接受者类型用值类型还是指针类型?

    Go语言的方法接受者类型用值类型还是指针类型?

    这篇文章主要介绍了Go语言的方法接受者类型用值类型还是指针类型?本文还同时讲解了关于接受者的命名方式,需要的朋友可以参考下
    2014-10-10
  • Golang交叉编译之跨平台编译使用详解

    Golang交叉编译之跨平台编译使用详解

    这篇文章主要为大家介绍了Golang交叉编译之跨平台编译使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10

最新评论