Go Struct에서 밑줄 필드를 사용하는 이유
Lukas Schneider
DevOps Engineer · Leapcell

서문
Go 프로그래밍 언어에서 우리는 원치 않는 변수를 무시하기 위한 자리 표시자, 사이드 이펙트만을 위해 패키지를 가져오거나, 타입 변환에서 변수를 무시하는 것과 같이 밑줄(_
)의 사용을 자주 봅니다. 그러나 대부분의 사람들은 struct 내에서 밑줄, 특히 _
라는 struct 필드를 정의하는 것을 접하지 못했을 수 있습니다.
그렇다면 그러한 필드를 정의하는 목적은 무엇일까요?
코드 비교: 밑줄(_
) 필드가 있는 Struct와 없는 Struct
먼저 밑줄(_
) 필드가 없는 struct의 예를 살펴보겠습니다.
model
패키지에서 Name
과 Age
라는 두 개의 필드가 있는 User
struct를 정의합니다.
type User struct { Name string Age int }
위치 기반 및 명명된 필드 초기화를 모두 사용하여 struct 변수를 선언합니다.
user := model.User{"Alice", 18} user = model.User{Name: "Alice", Age: 18}
위 코드에서는 struct를 정의하거나 선언하는 데 아무런 문제가 없습니다.
이제 struct에 밑줄(_
) 필드가 포함된 예를 살펴보겠습니다.
model
패키지에서 Name
, Age
및 _
의 세 가지 필드가 있는 User
struct를 정의합니다.
type User struct { Name string Age int _ struct{} }
위치 기반 및 명명된 필드 초기화를 모두 사용하여 struct 변수를 선언합니다.
// 컴파일 오류: type model.User의 struct 리터럴에 값이 너무 적습니다. user := model.User{"Alice", 18} // 컴파일 오류: type model.User의 struct 리터럴에서 내보내지 않은 필드 _에 대한 암시적 할당 user = model.User{"Alice", 18, struct{}{}} // 유효함 user = model.User{} user = model.User{Name: "Alice", Age: 18}
위의 예에서 user := model.User{"Alice", 18}
또는 model.User{"Alice", 18, struct{}{}}
를 사용하여 struct 변수를 선언하면 둘 다 위치 기반 초기화 방법이므로 프로그램에서 컴파일 오류가 발생합니다. 그러나 영값 초기화 또는 명명된 필드 초기화를 사용하면 문제없이 작동합니다.
밑줄(_
) 필드가 있는 struct와 없는 struct 예제를 비교하여 그러한 필드를 정의하는 목적을 결론지을 수 있습니다. struct에 _
라는 필드를 추가하면 영값 struct 변수 선언의 경우를 제외하고 struct가 명명된 필드 초기화를 사용하여 초기화되도록 강제합니다.
원리에 대한 간단한 분석
위치 기반 초기화를 사용하여 struct를 선언할 때 정의된 정확한 순서대로 모든 필드에 값을 제공해야 합니다.
struct에 _
라는 필드가 포함되어 있고 _
필드에 값을 제공하지 않고 위치 기반 초기화를 사용하는 경우 컴파일러는 다음과 같은 오류를 발생시킵니다.
type XXX의 struct 리터럴에 값이 너무 적습니다.
이는 모든 필드 값이 제공되지 않았기 때문에 발생합니다.
올바른 순서로 모든 필드에 값을 제공하더라도 컴파일러는 여전히 오류를 발생시킵니다.
type XXX의 struct 리터럴에서 내보내지 않은 필드 _에 대한 암시적 할당
이는 _
필드가 소문자로 시작하므로 내보내지 않은 것으로 간주되기 때문입니다. 위치 기반 초기화를 사용하여 내보내지 않은 필드에 값을 할당할 수 없습니다. 결과적으로 이 방법으로 이 struct를 초기화할 수 없습니다.
요약하면 밑줄(_
) 필드가 있는 struct 변수는 위치 기반 초기화를 사용하여 선언할 수 없으므로 영값 초기화 또는 명명된 필드 초기화의 두 가지 유효한 접근 방식만 남게 됩니다.
결론
이 논의를 통해 Go struct 정의에서 필드 이름으로 밑줄(_
)의 특별한 사용법에 대해 배웠습니다.
특히 _
라는 필드를 정의하면 struct의 인스턴스를 만들 때 명명된 필드 초기화를 효과적으로 강제하여 위치 기반 초기화의 사용을 방지할 수 있습니다. 이 접근 방식의 장점은 다음과 같습니다.
- 코드 가독성: 명명된 필드 초기화는 각 값을 필드 이름과 명시적으로 연결하여 가독성과 유지 관리성을 향상시킵니다.
- 오류 방지: 위치 기반 초기화는 필드 순서를 엄격히 준수해야 하므로 오류가 발생하기 쉽습니다. 명명된 필드 초기화는 이러한 위험을 제거합니다.
저희는 Go 프로젝트 호스팅을 위한 최고의 선택인 Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하세요.
무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 지불하세요. 요청도 없고, 요금도 없습니다.
최고의 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불하세요.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완벽하게 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
간편한 확장성 및 고성능
- 고도의 동시성을 쉽게 처리할 수 있도록 자동 확장합니다.
- 운영 오버헤드가 전혀 없습니다. 구축에만 집중하세요.
설명서에서 더 많은 내용을 살펴보세요!
X에서 팔로우하세요: @LeapcellHQ