结构体类型中的嵌入字段访问
在 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中文网其他相关文章!