Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > go语言 嵌套结构体

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

作者:阿贾克斯的黎明

在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语言 嵌套结构体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文