Go 언어는 함수와 메소드가 여러 값을 반환할 수 있다
이 특징은 C언어에서 EOF을 나타내기 위해 -1 과 같은 값을 반환하고 주소로 전달한 매개변수를 변환시켜야 하는 등 여러 골치 아팠던 문법을 개선할 수 있음
C언어에서는 에러 코드와 음수로 에러를 표기하는 방법을 임의의 공간에 저장해놓음
func (file *File) Write(b []byte) (n int, err error)
Go언어의 write에서는 카운트와 에러를 다음과 같은 의미로 반환함
그리고 write메소드는 n != len(b)인 경우에 바이트 갯수와 nil이 아닌 error를 반환함
다음 코드는 바이트 슬라이스에서 숫자를 찾은 다음 그 숫자와 다음 위치를 반환하는 함수다.
다음 코드 처럼 값과 위치를 같이 리턴할 수 있기 때문에 c언어에서 처럼 참조(reference) 인자 (↔ 값(value)인자) 처럼 변수를 리턴할 때 포인터를 넘길 필요도 없음
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
}
func nextInt(b []byte, pos int) (value, nextPos int) {
위에 nextInt함수의 반환 값들에 이름을 주게 되면 어떤 int값을 반환하고 있는진 명확해짐
아래 코드는 이를 잘 보여주는 io.ReadFulll함수다