2012-09-24 2 views
2

Guava Preconditions Java에서 메서드 매개 변수를 쉽게 확인할 수 있습니다. 조건이 충족되지 않을 경우Go에서 함수 매개 변수를 확인하는 방법

public void doUsefulThings(Something s, int x, int position) { 
    checkNotNull(s); 
    checkArgument(x >= 0, "Argument was %s but expected nonnegative", x); 
    checkElementIndex(position, someList.size()); 
    // ... 
} 

이 검사 방법은 예외를 발생.

이동에는 예외가 없지만 반환 값에는 오류가 있음을 나타냅니다. 그래서 위 코드의 관용적 인 Go 버전이 어떻게 생겼는지 궁금합니다.

답변

1

나는 매개 변수의 기본 속성은 언어의 철학에 확인하는 주장을 사용하여 확실하지 않다.

func doUsefulThings(s *Something) error { 
     // return an error if your algorithm detect an invalid value 

s이 아니라고 어서 트 :

정말 (예를 들어 당신이 데이터베이스에 찾을 수없는) 버그없이 유효하지 않은 값을 가질 수있는 매개 변수의 경우

, 오류를 반환 nil은 자세한 정보 만 추가합니다. nil을 제공하지 않았 음을 확인할 때 아무런 의미가 없습니다.

이 오류를 확인하기 위해 모든 사용자, 특히, error 힘을 반환 매개 변수를 추가. 호출자 코드의 사소한 버그를 방어하기 위해 함수에 코드를 작성하지 마십시오. 호출자는 함수를 호출하기 전에 코드의 나머지 부분에 따라 가능한 경우 nil, 이 아닌지 단순히 테스트해야합니다.

2

상황에 따라 다릅니다. doUsefulThings 패키지에서 내 보낸 공용 함수 인 경우

error을 반환합니다. 반환 할 수있는 패키지 레벨 error을 내보낼 수 있으며 발신자는 반환 된 error이 문서화 된 방법 중 하나와 일치하는지 확인할 수 있습니다. 이 수출 아니에요, 잘못 전화를 프로그래머 오류가 될 경우

, 나는 그것이 panic(errors.New("bla bla bla"))에 합리적인 생각합니다. 어쨌든 포인터를 역 참조 한 후에는 함수가 패닉을 일으킬 수 있습니다. 이를 위해

: checkArgument(x >= 0, "Argument was %s but expected nonnegative", x) 당신은 uint에 전달할 수 있습니다.

+0

Panicing는 문서화 및 가능성, 예를 들어 볼 MustXYZ 이름 특히, 내 보낸 함수 나 방법도 괜찮을 것 regexp.MustCompile (http://golang.org/pkg/regexp/#MustCompile) – Volker

관련 문제