선언문이 있는 각각의 공간
관련 있는 문장을 묶은 것
식별자의 스코프(scope)
- 식별자의 Lifecycle(생명주기)
: 블록 내에서 선언/정의될 때 식별자가 생성
: 블록이 끝날때 식별자가 제거
- 즉, 블록 내에서만 해당 식별자를 사용할 수 있고
블록 밖에서는 해당 식별자를 접근할 수 없다
패키지 블록
- 함수 외부에 선언된 것들이 속함
- :=은 사용 불가
- 대문자로 시작하는 식별자는 패키지 외부에 노출(expose)됨
- 노출된 식별자는 점 연산자를 통해 접근
- .go 파일이 여러 개더라도 package 이름이 같으면 같은 패키지 블록에 포함된다
파일 블록
- .go 파일에 선언된 것들
- import 문이 포함된 파일
함수 블록
- 로컬 변수: 매개변수(파라미터), 반환 변수도 포함
- 모든 중괄호는 새로운(다른) 블록을 정의
- 제어 구조도 자체의 블록을 가진다.
식별자 접근
- 외부 블록에서는 내부 블록의 요소(식별자)에 접근 불가
- 내부 블록에서는 자신과 외부 블록의 요소에 접근 가능
섀도잉(Shadowing)
- 외부 블록과 내부 블록의 식별자가 같은 경우 내부 블록의 식별자로 처리
- 내부 식별자에 의해 외부 식별자가 그림자에 가려 보이지 않음
:= 연산자
1) 선언부는 한 번만 실행
2) 조건부가 참일 경우에만 for 블록 실행, 거짓이면 for 문 종료
3) 증감부는 for 블록 실행이 끝나고 다시 2)으로 가기전에 실행
내장 타입의 요소(문자열, 배열, 슬라이스, 맵)를 순회하며 루프 수행
range가 두 개의 값을 반환
- (index, value) 쌍
cf.) Go에서는 반환되는 값을 사용할 의도나 필요가 없다면 _(underscore)로 받는다. (Python과 같은 개념)
키 값만 순회하는 대표적인 예
- 맵 타입을 집합 타입으로 사용한 경우
- 맵의 값보다는 유니크한 키 값이 중요 ⇒ 집합(셋)
맵을 for-range로 순회
- 요소를 처리하는 순서가 일정하지 않다 (보안 이슈)
문자열을 for-range 순회
- 룬을 순회, 바이트 순회 아님
for-range의 값은 복사본
- for-range 값으로 원본을 수정할 수 없다
레이블링(labeling)
- 레이블: 프로그램 코드 위치에 이름 붙인 것
- break, continue, goto 문의 대상이 됨
[SYNTAX]
switch [selector] {
case value|condition:
문장1
문장2
...
case
case
}
1급 객체
main 함수
- 프로그램 진입점
- 실행 파일을 만들려면 필요
- 인자 X
- 반환값 X
함수 선언 = 함수 헤더(시그니처) + 함수 몸체(바디)
1) func 키워드
2) 함수 이름
3) 입력 파라미터: 반드시 타입 명시 (Go는 정적 언어)
4) 반환값의 타입
⇒ 함수의 시그니처
return 키워드
여러 입력 파라미터가 같은 타입이라면 콤마로 파라미터를 구별하고 타입은 마지막에 기술할 수 있다.
임의 개수의 입력 파라미터 처리
가변 파라미터는 반드시 함수의 입력 파라미터 목록에서 마지막에 위치
타입 이름 앞에 ...
가변 파라미터는 함수 내에서는 해당 타입의 슬라이스이다
슬라이스를 파라미터로 Unpack하려면 슬라이스뒤에 ...을 붙여준다
함수 정의시 반환값의 타입을 콤마로 구분하고 괄호로 묶어준다
return 시 반환값을 괄호로 묶지 않는다
일반적으로 다중 반환값을 받을 때는 := 사용
[SYNTAX]
type 함수타입명 함수시그니처(함수 이름과 파라미터 이름 제외)