>백엔드 개발 >Golang >Go에서 구성된 구조체를 올바르게 초기화하는 방법은 무엇입니까?

Go에서 구성된 구조체를 올바르게 초기화하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-24 04:26:17423검색

How to Properly Initialize Composed Structs in Go?

Go에서 구성된 구조체 초기화

Go에서 구조체를 구성하려면 하나의 구조체를 다른 구조체 안에 삽입해야 합니다. 이 기술은 코드 구성 및 재사용 이점을 제공하지만 초기화 문제가 발생할 수도 있습니다.

구성된 구조체를 초기화할 때 포함된 구조체의 필드에 직접 액세스하는 것이 불가능할 수 있습니다. 다음 코드 예제를 고려하십시오.

type Base struct {
    ID string
}

type Child struct {
    Base
    a int
    b int
}

// Error: unknown field 'ID' in struct literal of type Child
// child := Child{ ID: id, a: a, b: b }

이 예제에서는 필드 액세스 불가능으로 인해 Child 구조체 리터럴에서 ID 필드를 직접 초기화하려는 시도가 실패합니다. 이 문제를 해결하려면 먼저 ID 없이 Child 구조체를 초기화한 다음 ID를 별도로 설정해야 합니다.

그러나 이 접근 방식은 Child 구조체의 내부 구조를 사용자에게 노출시켜 캡슐화를 손상시킵니다. 이를 방지하기 위해 Go에서는 구성된 구조체를 안전하게 초기화하는 방법인 중첩 복합 리터럴을 제공합니다.

중첩 복합 리터럴 사용

중첩 복합 리터럴을 사용하면 내장된 구조체 값을 초기화할 수 있습니다. 단일 표현식 내에서:

child := Child{Base: Base{ID: id}, a: a, b: b}

이 예에서 Base 구조체는 ID 필드가 원하는 값으로 설정된 상태로 먼저 초기화됩니다. 그런 다음 결과 Base 구조체는 Child 구조체를 초기화하는 데 사용됩니다.

대체 접근 방식

Go 이슈 9859에서는 임베디드 구조체의 초기화를 단순화하는 변경 사항을 제안합니다. 이 변경으로 인해 Child{ ID: id, a: a, b: b } 표현식이 허용되어 포함된 유형에 대한 필드 액세스와 일관되게 됩니다.

캡슐화 고려 사항

임베디드 유형은 Go에서 진정한 캡슐화를 제공하지 않는다는 점에 유의하는 것이 중요합니다. 애플리케이션은 둘러싸는 구조체의 메서드를 우회하여 포함된 구조체의 필드에 계속 직접 액세스할 수 있습니다. 따라서 구조체를 설계할 때 캡슐화의 필요성을 신중하게 고려하세요.

위 내용은 Go에서 구성된 구조체를 올바르게 초기화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.