Go 언어의 할당 연산자


84

최근에 저는 구글의 새로운 프로그래밍 언어 인 Go를 가지고 놀았습니다.

할당 연산자 :=가 등호 앞에 콜론이있는 이유가 궁금 = 했습니다. 언어 작성자가 name := "John"대신 사용하려는 특별한 이유가 있습니까?name = "John"


좋은 질문과 대답은 할당에 =를 사용하는 것은 실수라는 것입니다. x + 2 = 4는 할당이 아니라 방정식이라는 것을 일찍 배웠습니다. 그러나 할당이 동등성 검사보다 훨씬 더 빈번하기 때문에 일부 지배적 인 언어는 초기에 할당에 "="를 사용하기 시작했고 규칙이 고착되었습니다.
Rick O'Shea

답변:


121

:=표기법 선언 같이 초기화로서 모두 작용한다.

foo := "bar"

다음과 같다

var foo = "bar"

foo = "bar"스크립팅 언어에서 like 만 사용하지 않는 이유 는 무엇입니까? 글쎄, 그것은 오타를 피하기위한 것입니다.

foo = "bar"
fooo = "baz" + foo + "baz"   // Oops, is fooo a new variable or did I mean 'foo' ?

41
name := "John"

단지 구문상의 설탕입니다.

var name string
name = "John"

Go는 정적으로 형식화되어 있으므로 변수를 선언해야합니다.


7
name := "John"var name = "John".
peterSO 2013 년

15
@peterSO하지만 var name = "John"짧은 위해 var name string = "John"어떤 주어진 두 라인 짧다.
Dave C

2
@Dave C : Go 프로그래밍 언어 사양 은 명시 적입니다. "짧은 변수 선언 ...은 이니셜 라이저 표현식이 있지만 유형이없는 정규 변수 선언에 대한 속기입니다. "var" IdentifierList = ExpressionList .".
peterSO

7
@peterSO 저도 알아요. 그것은 내가 말한 것을 바꾸지 않습니다. 정답입니다.
Dave C

1
@KennethWorden 가독성을 어떻게 방해합니까? 불필요한 정보를 최소화합니다. 완전한 유형 추론을 사용하는 언어는 이것이 좋은 이유에 대한 좋은 예입니다.
Joonazan

19

:=할당 연산자가 아닙니다. 짧은 변수 선언입니다. =할당 연산자입니다.

짧은 변수 선언

짧은 변수 선언은 다음 구문을 사용합니다.

ShortVarDecl = IdentifierList ":=" ExpressionList .

이니셜 라이저 표현식이 있지만 유형이없는 정규 변수 선언의 속기입니다.

"var" IdentifierList = ExpressionList .

과제

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

이동에 name := "John"대한 속기 var name = "John".


11

Rob Pike Go의 :="Origins of Go"(2010) 강연에서 Go의 이유를 설명합니다 .

:=Newsquek (1989)라고하는 Pike가 코드 서명 한 다른 언어의 의사 연산자였습니다. Pascal-ish 표기법과 관용구 선언 및 초기화를위한 유형을 추론 할 수있는 기능 ( 15 페이지 )

// variable: [type] = value
x: int = 1
x := 1

한계 메모 : Robert Griesemer := "Go에서 꺼내는 것은 무엇입니까?"라는 질문에 대답하는 운영자를 불러옵니다. Google I / O 2013에서 QA 세션 중에 . 편리하지만 문제가 있다고 언급했습니다 .


4

둘 다 Go 언어에서 변수 선언의 다른 기술입니다.

var name = "John" // is a variable declaration 

name := "John"   // is a short variable declaration. 

짧은 변수 선언은 이니셜 라이저 표현식이 있지만 유형이없는 정규 변수 선언의 속기입니다.

자세한 내용은 아래를 참조하십시오.

변수 선언

짧은 변수 선언


4

최소한 하나의 미묘한 차이가 있습니다.

name := "John"

var name = "John"

전자는 비 선언문이며 함수 본문 외부에서 허용되지 않는 반면 후자는 패키지 수준에서 유효한 명령문입니다.


2

답변에 대한 중요한 배경 :

:=변수 초기화를위한 속기 연산자입니다. 에서 이동 , 다음 작업은 동일합니다 :

var myNumb String = "one"
myNumb := "one"

대답:

이제 내포 된 질문은 "왜 ? :=:앞에있는 속기 표기법 을 디자인 =했는가?"입니다. 그 이유는 만연한 오타를 방지하기 위함입니다. 속기 할당 연산자가 just =이면 다음과 같은 상황이 발생할 수 있습니다.

var myNumb String = "one"
myNumb = "two"

이제 코드를 생성 한 사용자는 재 할당하려는 않았다 two으로 myNumb, 또는 그 잘못 입력 않았다 myNumb올바르게 입력하는 대신 myNumbTwo? 에 콜론을 포함하면 :=프로그래머는 var버그를 가지기 위해 두 개의 오류 (콜론은 잊어 버리고는 잊어 버림)를 커밋 해야하므로 그렇게 할 가능성이 크게 줄어 듭니다 .

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