Go에서는 표준 포인터 동일성 연산자 ==를 사용하여 nil이 아닌 두 함수 포인터의 동일성을 비교하는 기능이 최근 버전에서 유효하지 않게 되었습니다. 이는 함수 포인터의 동일성을 비교할 수 있었던 Go1 이전 동작에서 벗어났습니다.
함수 포인터 동등성을 비교하는 것을 금지하는 동기는 다음과 같습니다. 다음 이유:
함수에 대한 직접적인 포인터 비교는 더 이상 허용되지 않지만, 원하는 동작을 달성하기 위한 대체 접근 방식이 있습니다.
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 fmt.Println(f1 == f1) // Prints true fmt.Println(f1 == f2) // Prints false }
package main import "fmt" import "reflect" func SomeFun() {} func AnotherFun() {} func main() { sf1 := reflect.ValueOf(SomeFun) sf2 := reflect.ValueOf(SomeFun) fmt.Println(sf1.Pointer() == sf2.Pointer()) // Prints true af1 := reflect.ValueOf(AnotherFun) fmt.Println(sf1.Pointer() == af1.Pointer()) // Prints false }
참고: Reflect 사용은 정의되지 않은 동작에 의존합니다. 플랫폼이나 Go 버전 전반에 걸쳐 일관성을 보장하지 않습니다.
위 내용은 Go에서 함수 포인터의 동등성을 어떻게 비교할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!