구조체 유형에 포함된 필드 액세스
Go에서 구조체는 다른 구조체를 필드로 포함할 수 있습니다. 이는 복잡한 데이터 구조의 구성을 허용합니다. 그러나 포인터를 사용할 때 포함된 필드 값에 액세스하면 혼란스러울 수 있습니다.
예 및 문제
다음 구조체 정의를 고려하세요.
<code class="go">type Engine struct { power int } type Tires struct { number int } type Cars struct { *Engine Tires } </code>
In Engine 구조체(*Engine)에 대한 내장 포인터인 Cars 구조체가 정의됩니다. 다음과 같이 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]
해결 방법
To 포함된 필드 값에 액세스하려면 명시적인 필드 이름이나 포함된 포인터를 통한 간접 참조가 필요합니다. 다음은 간접 참조를 통해 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!