Go에서 함수는 일급 값입니다. 즉, 함수는 변수에 할당되고 다른 함수에 인수로 전달될 수 있습니다. 그러나 Go의 다른 유형과 달리 함수는 기본적으로 비교할 수 없습니다. 이는 코드에서 함수를 비교하려고 할 때 혼란을 초래할 수 있습니다.
Go 언어 사양에 자세히 설명되어 있듯이 함수 값은 비교할 수 없습니다. == 또는 !=와 같은 표준 비교 연산자를 사용하여 함수 값을 비교하려고 하면 컴파일러 오류가 발생합니다.
<code class="go">if handler.Post != Undefined { // ... }</code>
코드 샘플에 있는 정의되지 않은 함수 일반 함수와 같은 방식으로 정의되지 않은 함수의 예입니다. 이는 단일 문자열 인수를 취하고 아무것도 반환하지 않는 함수(func Undefine(foo string))로 선언됩니다. 그러면 정의되지 않음이 init 함수에 있는 Handler 구조체의 Get 필드에 할당됩니다. 이 할당은 Get 필드에 저장되는 정의되지 않음에 대한 함수 값을 생성합니다.
함수 자체는 비교할 수 없지만 함수 값의 주소를 비교할 수 있습니다. 이는 fmt.Sprintf 함수를 사용하여 함수 주소의 문자열 표현을 얻은 다음 결과 문자열을 비교함으로써 달성할 수 있습니다.
<code class="go">p1 := fmt.Sprintf("%v", Undefined) p2 := fmt.Sprintf("%v", hand.Get) fmt.Println("Expecting true:", p1 == p2)</code>
이 방법은 함수 값을 문자열로 효과적으로 변환합니다. == 연산자를 사용하여 비교합니다.
함수 비교에 대한 대체 접근 방식 값 주소는 Reflect.Value.Pointer() 메서드를 사용하는 것입니다. 이 메서드는 반영된 값의 메모리 주소를 반환한 후 다른 함수 값의 주소와 비교할 수 있습니다.
<code class="go">u1 := reflect.ValueOf(Undefined).Pointer() u2 := reflect.ValueOf(hand.Get).Pointer() fmt.Println("Expecting true:", u1 == u2)</code>
일반적으로 함수를 비교하는 것은 권장되지 않습니다. 값 주소. 대신, 이러한 비교가 필요 없도록 코드를 리팩터링하는 것이 더 효율적이고 유지 관리가 쉬운 접근 방식입니다. 원하는 동작을 달성하려면 인터페이스 정의 또는 유형 어설션 사용과 같은 다른 접근 방식을 사용하는 것이 좋습니다.
위 내용은 Go에서 함수를 어떻게 비교할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!