Go에서 함수 포인터 동일성
Go에서 == 또는 != 연산자를 사용하여 함수 포인터가 동일한지 비교하는 것은 허용되지 않습니다. 0이 아닙니다. 이 동작은 동일성과 동일성 비교가 혼합되는 것을 방지합니다.
함수 동일성은 함수 동일성과 다릅니다. 두 함수가 동일한지 확인하려면 동일성 비교를 사용해야 하고, 두 함수가 동일한지 확인하려면 동일성 비교를 사용해야 합니다.
Atom 예제에 표시된 것처럼 Reflect 패키지를 사용하여 함수 동일성을 비교합니다. , 정의되지 않은 동작으로 간주됩니다. 컴파일러는 구현을 병합하여 함수를 최적화할 수 있으므로 비교가 신뢰할 수 없게 됩니다.
신원을 확인하기 위해 함수 포인터를 올바르게 비교하려면 각 함수에 대해 고유한 변수를 만든 다음 해당 변수의 주소를 비교할 수 있습니다. 이 접근 방식을 사용하면 최적화에 관계없이 동일한 함수에 대한 함수 포인터를 비교할 수 있습니다.
다음은 함수 포인터의 동일성을 비교하는 방법의 예입니다.
package main import "fmt" func F1() {} func F2() {} var F1_ID = F1 // Create a *unique* variable for F1 var F2_ID = F2 // Create a *unique* variable for F2 func main() { f1 := &F1_ID // Take the address of F1_ID f2 := &F2_ID // Take the address of F2_ID // Compare pointers fmt.Println(f1 == f1) // Prints true fmt.Println(f1 == f2) // Prints false }
위 내용은 Go에서 ID에 대한 함수 포인터를 어떻게 안전하게 비교할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!