Go 선언에서“_,”(밑줄 쉼표)는 무엇입니까?


100

그리고 나는 이런 종류의 변수 선언을 이해하지 못하는 것 같습니다.

_, prs := m["example"]

" _," 이 (가) 정확히 무엇을 하고 있으며 왜 대신 이와 같은 변수를 선언 했습니까?

prs := m["example"]

( Go by Example : Maps의 일부로 찾았습니다 . )


3
향후 언어 질문에 대해서는 먼저 사양을 살펴보십시오 . 모든 질문에 답해야합니다.
fuz

코멘트로서 : prs아마도 "현재"를 의미합니다. 귀하의 예제 코드 "example"m맵에 항목이 있는지 여부를 확인합니다 .
dyoo

6
@FUZxxl 예, 이전에 살펴 봤지만 기능의 이름을 몰라서 찾지 못했습니다. 또한 프로그래밍 언어에 대한 공식 사양이 교육적이지 않고 예제로 배우는 것으로 나타났습니다.
Kansuler 2015 년

@dyoo 일단 아래에 설명이 있으면 그 의미를 알아 냈지만 다른 사람이 같은 질문을 가지고 있다면 주목할 가치가 있습니다!
Kansuler 2015 년

8
@FUZxxl : 모르겠어요. SO에서 묻는 대부분의 질문에는 아마도 어딘가에 답변이 있을 것입니다. 그 아래에는 질문을하지 말아야 할 임계 값이 있지만,이 질문이 그 아래에 있다고 생각하지 않습니다.
thb

답변:


121

반환 값에 대한 모든 변수를 선언 할 필요가 없습니다.
이를 공백 식별자 라고합니다 .

에서와 같이 :

_, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate

( 다른 ' _'사용 사례는 가져 오기를위한 것입니다. )

반환 값을 버리기 때문에 "에서와 같이 반환 값 중 하나만 확인하고 싶을 때 유용합니다. " Effective Go, map "에 표시된 " 맵에서 키 존재를 테스트하는 방법 .

_, present := timeZone[tz]

실제 값에 대해 걱정하지 않고지도에 존재하는지 테스트하려면 빈 식별자 인 간단한 밑줄 ( _)을 사용할 수 있습니다 .
공백 식별자는 모든 유형의 값으로 할당하거나 선언 할 수 있으며 값은 무해하게 버립니다.
맵에서 존재 여부를 테스트하려면 값에 대한 일반적인 변수 대신 빈 식별자를 사용합니다.

같이 Jsor는 추가 의견에 :

"일반적으로 허용되는 표준"은 멤버십 테스트 변수 "ok"를 호출하는 것입니다 (채널 읽기가 유효한지 여부를 확인하는 것과 동일).

이를 통해 테스트와 결합 할 수 있습니다.

if _, err := os.Stat(path); os.IsNotExist(err) {
    fmt.Printf("%s does not exist\n", path)
}

루프에서도 찾을 수 있습니다.

범위 (값)에서 두 번째 항목 만 필요한 경우 빈 식별자 인 밑줄을 사용하여 첫 번째 항목을 삭제합니다.

sum := 0
for _, value := range array {
    sum += value
}

좋은 예를 들어 주셔서 감사합니다. 개념을 이해하는 데 약간의 생각이 필요했지만 지금은 이해합니다!
Kansuler 2015 년

IME "일반적으로 허용되는 표준"은 멤버십 테스트 변수 "ok"를 호출하는 것입니다 (채널 읽기가 유효한지 여부를 확인하는 것과 동일 함).
LinearZoetrope

1
@Jsor 동의합니다. 더 많은 가시성을 위해 답변에 귀하의 의견을 포함하고 몇 가지 추가 예를 추가했습니다.
VonC

64

Go 컴파일러는 절대 사용하지 않는 변수를 만들 수 없습니다.

for i, value := range x {
   total += value
}

위 코드는 "내가 선언했고 사용하지 않았습니다"라는 오류 메시지를 반환합니다.

루프 내에서 i를 사용하지 않기 때문에 다음과 같이 변경해야합니다.

for _, value := range x {
   total += value
}

13
공백 식별자로 _가있는 이유를 이해하는 데 첫 번째 문장이 중요했습니다.
Tarik

4

_빈 식별자입니다. 할당되어야하는 값이 폐기됨을 의미합니다.

여기에서 example버려지 는 키 값입니다 . 두 번째 코드 줄은 존재 부울을 버리고 값을에 저장합니다 prs.
따라서지도에서 존재 여부 만 확인하려면 값을 버릴 수 있습니다. 맵을 세트로 사용하는 데 사용할 수 있습니다.


3

빈 식별자는 구문에 변수 이름이 필요할 때마다 사용할 수 있지만 프로그램 논리는 그렇지 않습니다. 예를 들어 요소 값만 필요할 때 원치 않는 루프 인덱스를 버립니다.

발췌 :

Go 프로그래밍 언어 (Addison-Wesley 전문 컴퓨팅 시리즈)

브라이언 더블유 케르 니간

이 자료는 저작권으로 보호 될 수 있습니다.


2

빈 식별자라고하며 반환 될 값을 참조하지 않고 버리고 자하는 경우에 도움이됩니다.

우리가 그것을 사용하는 곳 :

  • 함수는 값을 반환하며 나중에 사용할 계획이 없습니다.
  • 반복을 원하고 사용하지 않을 i 값이 필요합니다.

1

기본적으로 _,빈 식별자라고합니다. GO에서는 사용되지 않는 변수를 가질 수 없습니다.

value : = range 를 사용하는 경우 배열을 반복 할 때 인스턴스로 반복을 위해 i 값을 원하지 않습니다 . 그러나 i 값을 생략하면 오류가 반환됩니다. 그러나 i를 선언하고 사용하지 않으면 오류도 반환됩니다.

따라서 그것이 우리가 사용해야하는 곳 _,입니다.

또한 앞으로 함수의 반환 값을 원하지 않을 때 사용됩니다.


1

사용하지 않는 변수의 가장 좋은 사용 사례는 부분 출력 만 필요한 상황입니다. 아래 예에서는 값 (주 인구) 만 인쇄하면됩니다.

package main
import (
    "fmt"
)
func main() {
          statePopulations := map[string]int{
          "California": 39250017,
          "Texas":      27862596,
          "Florida":    20612439,
          }
          for _, v := range statePopulations {
          fmt.Println(v)
    }
}

0

사용하지 않는 변수는 Golang에서 허용되지 않습니다.

다른 프로그래밍 언어에서왔다면 익숙해지기가 조금 어려울 수 있습니다. 그러나 이것은 더 깨끗한 코드를 생성합니다. 그래서 a를 사용함으로써 _우리는 거기에 변수가 있다는 것을 알고 있지만 그것을 사용하고 싶지 않고 컴파일러에게 그것에 대해 불평하지 않는다고 말합니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.