『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트입니다.
7장. 함수
함수의 필요성, 효율 등은 이미 알고 있으니, Go 언어에서의 특징만 확인해보자.
Go는 절차형 프로그래밍 언어
일단 Go는 함수형 프로그래밍 언어가 아니다. 확인해보니 익명 함수 등의 함수형 프로그래밍에서 사용할 기법을 제공하긴 하지만, 기본적으로 절차형 프로그래밍 언어에 맞게 함수를 작성해야 한다.
관련된 부분은 추후 언급되는 것으로 보이니 이번에는 생략하도록 하겠다.
다중 반환 함수
이전 ch05에서 언급했듯, Go에서는 함수가 여러 값을 한 번에 반환하는 기능을 제공한다.
또한 Go의 경우 함수의 선언/정의가 C/C++과 달리 어느 위치에나 존재해도 된다.
예시로 나온 나누기 함수에서 특정 요소들을 수정해봤다.
func Divide()
의 위치를 뒤로 옮겨서 함수의 선언/정의 위치 관계를 확인- 3개 이상의 값을 반환하도록 수정
- 변수명 지정 반환시에도 같은 타입의 반환 값의 타입 생략이 가능한지 확인
- 함수의 인자 개수가 길어질 때, 강제로 줄바꿈을 해도 아무 문제 없는지 확인
|
|
$ ./go_func_divide
The quotient of 16 divided by 5 is 3 with a remainder of 1
# 0으로 나누고, 예외처리를 하지 않도록 수정한 경우
$ ./go_func_divide_by_zero
panic: runtime error: integer divide by zero
goroutine 1 [running]:
main.Divide(...)
/Workspace/go/src/test/go_func_divide_by_zero.go:19
main.main()
/Workspace/go/src/test/go_func_divide_by_zero.go:8 +0x12
모두 정상적으로 돌아가는 것을 확인할 수 있다.
그리고 나누는 값에 대한 예외처리를 하지 않으면 panic
이 발생하는데, 이 부분은 추후 언급되는 것으로 보이니 생략하도록 하겠다.
재귀 호출과 Tail call
재귀 호출에 대한 개념이 나와서 Tail Call 최적화가 됐는지 궁금했다.
찾아보니 Go에서는 TCO가 적용되지 않았고, Go 2에서 지원하는 것을 제안했으나 거부당한 것으로 보인다.