Trong Go, có cách nào so sánh hai con trỏ hàm phi nil để kiểm tra tính bình đẳng không? Tiêu chuẩn bình đẳng của tôi là con trỏ bình đẳng. Nếu không, có bất kỳ lý do cụ thể tại sao con trỏ bình đẳng không được phép?Làm thế nào để tôi so sánh hai hàm cho bình đẳng con trỏ trong Go hàng tuần mới nhất?
Tính đến bây giờ, nếu tôi cố gắng để làm điều này một cách thẳng thắn:
package main
import "fmt"
func SomeFun() {
}
func main() {
fmt.Println(SomeFun == SomeFun)
}
tôi nhận được
./func-pointers.go:12: invalid operation: SomeFun == SomeFun (func can only be compared to nil)
Đó là sự hiểu biết của tôi rằng hành vi này đã được giới thiệu gần đây.
Tôi đã tìm thấy câu trả lời bằng cách sử dụng gói phản ánh; tuy nhiên Atom đề xuất bên dưới rằng điều này thực sự tạo ra hành vi không xác định. Xem bài đăng của Atom để biết thêm thông tin và giải pháp thay thế có thể có.
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())
af1 := reflect.ValueOf(AnotherFun)
fmt.Println(sf1.Pointer() == af1.Pointer())
}
Đầu ra:
true
false
Phản hồi tuyệt vời. Cảm ơn bạn! Bạn chắc chắn nhận được tín dụng để trả lời "tại sao", nhưng tôi nhầm lẫn về câu trả lời của bạn cho câu hỏi ban đầu của tôi. Có vẻ như nó đang kiểm tra danh tính của các biến F1_ID và F2_ID chứ không phải là danh tính của các hàm F1 và F2. Ví dụ, nếu tôi đã có 'var F1_ID2 = F1', sau đó & F1_ID == & F1_ID2 sẽ trả về true nếu chúng tôi đã kiểm tra nhận dạng chức năng; nhưng nó trả về sai. – BurntSushi5
Ngoài ra, phê phán của bạn về cách tiếp cận của tôi bằng cách sử dụng phản ánh lo lắng cho tôi. Bạn không gợi ý rằng bản sắc chức năng kiểm tra là không thể đảm bảo trong Go? – BurntSushi5
Comment1: Giả định trong đoạn mã cuối cùng là một hàm cụ thể có một ID duy nhất. –