首页 >后端开发 >Golang >使用指针访问 Go 结构体中的嵌入字段时如何避免运行时错误?

使用指针访问 Go 结构体中的嵌入字段时如何避免运行时错误?

DDD
DDD原创
2024-10-30 04:23:02994浏览

How to Avoid Runtime Errors When Accessing Embedded Fields in Go Structs with Pointers?

结构体类型中的嵌入字段访问

在 Go 中,结构体可以嵌入其他结构体作为字段。这允许组合复杂的数据结构。但是,使用指针时访问嵌入字段值可能会造成混乱。

示例和问题

考虑以下结构体定义:

<code class="go">type Engine struct {      
    power int             
}                         
                          
type Tires struct {       
    number int            
}                         
                          
                          
type Cars struct {           
    *Engine               
    Tires                 
}  </code>

In Cars 结构体中定义了一个指向 Engine 结构体 (*Engine) 的嵌入指针。当创建 Cars 实例时,如下所示:

<code class="go">func main() {                    
                                     
    car := new(Cars)             
    car.number = 4               
    car.power = 342     
    fmt.Println(car)            
} </code>

程序会出现以下错误:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x23bb]

解决方案

至访问嵌入字段值,需要显式字段名称或通过嵌入指针间接访问。下面是通过间接访问 power 字段的示例:

<code class="go">package main

import "fmt"

type Engine struct {
    power int
}

type Tires struct {
    number int
}

type Cars struct {
    *Engine
    Tires
}

func main() {
    car := new(Cars)
    car.Engine = new(Engine)
    car.power = 342
    car.number = 4
    fmt.Println(car)
    fmt.Println(car.Engine, car.power)
    fmt.Println(car.Tires, car.number)
}</code>

此代码成功初始化 Cars 实例,为嵌入字段赋值,并打印预期输出:

&{0x10328100 {4}}
&{342} 342
{4} 4

以上是使用指针访问 Go 结构体中的嵌入字段时如何避免运行时错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn