이 글은 Effective Go를 일부 번역한 글입니다.


함수

다중 변수 반환

Go의 색다른 특성 중 하나는 함수와 메서드가 값을 여러 개 반환할 수 있다는 것이다. 이 형태로 C 프로그램에서 쓰던 까다로운 두 가지 어법을 개선할 수 있다. 바로 EOF에 -1을 반환하는 것 같은 대역 내(In-band) 오류 반환과 인수를 주소로 주고 수정하는 것이다.

C에서 쓰기 오류는 음수로 나타내며 휘발성 공간에 오류 부호를 숨겨 놓는다. Go에선 Write가 숫자와 오류 둘 다 반환할 수 있다. “그래, 몇 바이트를 썼지만 다 쓴 건 아냐. 장치가 가득 찼어.” os 패키지에선 파일의 메서드인 Write의 용법을 이렇게 정의한다.

func (file *File) Write(b []byte) (n int, err error)

그리고 문서엔 n != len(b)일 땐 쓴 바이트 숫자와 nil이 아닌 error를 반환한다고 되어있다. 이런 형태가 일반적이다. 오류 처리 부분을 보면 더 많은 예를 볼 수 있다.

비슷한 방법으로, 반환 값 포인터를 참조 매개 변수로 만들어 넘길 필요도 없다. 아래 단순한 함수를 보라. 바이트 조각 내 위치부터 숫자를 뽑아내고 뽑아낸 숫자와 다음 위치를 반환한다.

func nextInt(b []byte, i int) (int, int) {
    for ; i < len(b) && !isDigit(b[i]); i++ {
    }
    x := 0
    for ; i < len(b) && isDigit(b[i]); i++ {
        x = x*10 + int(b[i]) - '0'
    }
    return x, i
}

이 함수로 이렇게 주어진 조각 b에서 숫자를 훑어낼 수 있다.

    for i := 0; i < len(b); {
        x, i = nextInt(b, i)
        fmt.Println(x)
    }