2015-04-16 45 views

Trả lời

27

Một lựa chọn đơn giản là khai báo một giao diện chỉ với phương pháp mà bạn muốn kiểm tra và sau đó làm một loại khẳng định chống lại bạn kiểu như;

i, ok := myInstance.(InterfaceImplementingThatOneMethodIcareAbout) 
// inline iface delcataration example 
i, ok = myInstance.(interface{F()}) 

Bạn có thể muốn sử dụng gói reflect nếu bạn định làm bất kỳ điều gì quá điên rồ với loại của mình; http://golang.org/pkg/reflect

st := reflect.TypeOf(myInstance) 
m, ok := st.MethodByName("F") 
if !ok { 
    // method doesn't exist 
} 
// do something like invoke m 
+11

Tôi thực sự muốn khuyến khích mọi người sử dụng các loại khẳng định chứ không phải phản ánh (hoặc, tốt hơn nếu bạn không có nhu cầu khác để đặt tên một iface một phương thức, một giao diện ẩn danh được chỉ định nội dòng như uraimo được đề xuất). Nhanh hơn, ngắn hơn, không nhập, không có chuỗi như tên phương thức. – twotwotwo

+0

@twotwotwo đã đồng ý. Tôi nghĩ rằng phản ánh chỉ thực sự có ý nghĩa nếu bạn đang đi để làm rất nhiều kiểm tra dẫn đến quyết định thời gian chạy về cách cư xử. Nếu bạn chỉ muốn xem liệu bạn có thể gọi một phương thức hay không, tùy chọn iface đơn giản hơn nhiều và nếu bạn chỉ sử dụng nó ở một nơi thì khai báo ẩn danh nội tuyến cũng tốt hơn. – evanmcdonnal

17

Nếu obj là một interface{} bạn có thể sử dụng Go loại khẳng định:

if correctobj, ok := obj.(interface{methodName()}); ok { 
    correctobj.methodName() 
} 
Các vấn đề liên quan