Tôi là người mới tham gia Go và tôi đã chiến đấu với vấn đề này hầu như cả ngày hôm nay.giao diện {} để chuyển đổi loại chức năng
Xét Tôi có những:
type HandlerType func()
var object interface{}
var typedObject HandlerType
tôi thể gán một chức năng để biến typedObject như thế này:
typedHandler = func() {
fmt.Println("in a handler!\n")
}
Nhưng những gì tôi cần làm là để vượt qua mà chức năng xử lý như một biến giao diện {} và sau đó chuyển đổi nó thành HandlerType mà tôi có thể gọi sau
Tôi đã thử điều này nhưng nó ném một lỗi:
typedHandler = object.(HandlerType)
kết quả trong:
interface conversion: interface is func(), not main.HandlerType
Về cơ bản tôi cần phải đăng ký chức năng có ký hiệu khác mà không cần chuyển đổi loại bổ sung trước khi đăng ký. Vì vậy, thay vì làm điều này:
registerHandler(HandlerTypeString(func() string { ... }))
registerHandler(HandlerTypeVoid(func() { ... }))
Tôi muốn đăng ký xử lý như sau:
registerHandler(func() string { ... })
registerHandler(func() { ... })
.. và tôi không muốn liên quan đến phản ánh tại thời điểm một cuộc gọi handler sau
Có thể không?
Sửa: Tôi đã tạo một sân chơi: http://play.golang.org/p/UlwqkHjt_P
Vì vậy, như tôi hiểu không có cách nào để vượt qua một số chức năng tùy ý như giao diện {} và sau đó bằng cách nào đó chuyển nó sang HandlerType hoặc một số được xác định trước khác chức năng loại vì vậy tôi sẽ có thể gọi nó mà không cần sử dụng sự phản ánh?
Edit2: Tôi đã đưa ra giải pháp này: http://play.golang.org/p/4gUxsgmiPf
Không nên có bất kỳ hình phạt hiệu suất trong thời gian chạy với mã này. Nhưng ai đó có thể nghĩ ra cách khác để triển khai chức năng này mà không cần giao diện {}?
Hiển thị mã đầy đủ. 'typedHandler = object. (HandlerType)' ** sẽ ** làm việc nếu đối tượng (thuộc kiểu 'interface {}') thực sự chứa một đối tượng 'HandlerType'. Hiển thị mã có thể phát trên sân chơi. – Volker
Một điều nữa: Nếu bạn là người mới, bạn nên tránh 'giao diện {}'. Finde một số cách khác, nhà văn thích hợp Go mã. Một người mới cho 'giao diện {} 'ma thuật có mùi giống như chuyển ngữ mã từ một số ngôn ngữ khác. – Volker
Tôi đã thêm một sân chơi nơi tôi nghĩ rằng tôi đã thực hiện rõ ràng về những gì tôi muốn hoàn thành :) – user3668351