>백엔드 개발 >Golang >Go의 익명 구조체: `map[string]struct{}`에서 유형을 지정하는 것이 언제 중복됩니까?

Go의 익명 구조체: `map[string]struct{}`에서 유형을 지정하는 것이 언제 중복됩니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-30 04:06:28351검색

 Anonymous Struct in Go:  When is it Redundant to Specify the Type in `map[string]struct{}`?

익명 구조체: 구조체{}{}와 {}

Go에서 문자열-익명 구조체 맵 선언의 차이점 공개 두 가지 방법으로 수행할 수 있습니다:

<code class="go">var Foo = map[string]struct{}{
    "foo": struct{}{},
}</code>
<code class="go">var Foo = map[string]struct{}{
    "foo": {},
}</code>

두 표현식 모두 유효하지만 두 번째 표현식은 Gogland에서 "중복 유형 선언"에 관한 경고를 발생시킵니다. 명확히 하기 위해 이 두 형식의 근본적인 차이점을 살펴보겠습니다.

먼저 다음을 고려하세요.

<code class="go">struct{}{}</code>

이것은 유형(struct{})과 그 유형으로 구성된 복합 리터럴입니다. 값 ({}). 대조적으로 이것은

<code class="go">{}</code>

유형을 생략하고 값만 유지하는 복합 리터럴입니다.

일반적으로 복합 리터럴에는 컴파일러가 식별하는 데 도움이 되도록 유형 사양을 포함해야 합니다. 의도한 유형입니다. 언어 사양에 따라:

CompositeLit = LiteralType LiteralValue .

그러나 맵 복합 리터럴을 정의할 때 키 및 값 유형은 이미 맵 유형에 의해 지정됩니다. 따라서 이러한 지정된 유형의 값을 제공하려는 경우 유형 지정을 생략할 수 있습니다.

이러한 생략은 Go 사양에 의해 허용되며 다음과 같습니다.

"Within a composite literal of array, slice, or map type T, elements or map keys that are themselves composite literals may elide the respective literal type if it is identical to the element or key type of T."

결론적으로 , 처음에 제시된 두 표현은 동일한 최종 결과를 얻습니다. 그러나 후자는 지도 복합 리터럴에서 중복 유형 지정을 생략할 수 있는 언어 기능을 활용합니다.

위 내용은 Go의 익명 구조체: `map[string]struct{}`에서 유형을 지정하는 것이 언제 중복됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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