변수
변수 (Variables)
변수는 값을 담아 두는 저장 공간이에요. 그런데 아무 값이나 막 담을 수는 없고, 그 변수의 타입(type)이 허용하는 값들만 담을 수 있어요. 어떤 값이 허용되는지는 바로 그 변수의 타입이 정해 주는 거죠.
출처: Go Specification
본문
변수는 하나의 값(value)을 담는 저장 공간이에요. 담을 수 있는 값의 범위는 그 변수의 *타입*에 의해 결정됩니다.
이름 있는 변수를 위한 저장 공간은 두 가지 방법으로 확보돼요. 하나는 *변수 선언*이고, 다른 하나는 함수의 매개변수와 결과값을 위한 것인데, 이때는 *함수 선언*이나 *함수 리터럴*의 시그니처가 그 역할을 해요.
런타임에 변수를 만들고 싶을 때는 내장 함수 *new*를 호출하거나, *복합 리터럴*의 주소를 취하면 돼요. 이렇게 만들어진 변수는 이름이 없어요. 그래서 이런 익명 변수는 (암시적인) *포인터 간접 참조*를 통해서만 접근할 수 있어요.
배열, 슬라이스, 구조체 타입처럼 구조화된 변수는 각각의 요소와 필드를 따로 *주소 지정*할 수 있어요. 이 구조화된 변수의 요소 하나하나가 그 자체로 변수처럼 동작하는 셈이죠.
변수의 정적 타입(static type, 줄여서 그냥 타입)은 선언에서 주어진 타입, new 호출이나 복합 리터럴에서 제공된 타입, 또는 구조화된 변수의 요소 타입 중 하나예요.
인터페이스 타입의 변수에는 여기에 더해서 별개의 동적 타입(dynamic type)이 있어요. 이 동적 타입은 런타임에 그 변수에 할당된 값의 (인터페이스가 아닌) 타입을 말하는데, 다만 그 값이 타입이 없는 사전 선언 식별자 nil인 경우는 제외해요. 동적 타입은 실행 중에 바뀔 수 있지만, 인터페이스 변수에 저장되는 값은 언제나 그 변수의 정적 타입에 *할당 가능*해야 해요.
var x interface{} // x is nil and has static type interface{}
var v *T // v has value nil, static type *T
x = 42 // x has value 42 and dynamic type int
x = v // x has value (*T)(nil) and dynamic type *T
변수의 값은 그 변수를 *표현식*에서 참조함으로써 가져와요. 그 값은 변수에 가장 최근에 *할당*된 값이에요. 아직 값을 한 번도 할당하지 않았다면, 그 변수의 값은 해당 타입의 *제로 값*이 됩니다.