所以,我有這樣的功能
func ProcessRequest(requestBody *SignInRequest, response func(SignInResponse) *src.Response, error func(ControllerError) *src.Response) *src.Response {
return error(ControllerError{Code: http.StatusNotImplemented})
}
而我試圖稱之為
ProcessRequest(payload, myFunction, handler.OnControllerError)
func myFunction(i interface{}) *src.Response {
}
這向我顯示了一個錯誤
不能使用 'myFunction' (type func(i interface{}) *src.Response) 作為型別 func(SignInResponse) *src.Response
但是如果我嘗試同樣的事情
type TestStruct struct {
}
func myFunction2(i interface{}) *src.Response {
}
myFunction2(TestStruct{})
然后它沒有顯示任何錯誤。
我希望它interface{}作為一個論點,因為我想myFucntion成為可以接受任何struct.
uj5u.com熱心網友回復:
你混淆了兩件事。
當你有一個帶有 signaure 的函式時func (interface{}) *src.Response,你確實可以在傳遞任何型別的值的同時呼叫它,但事實并非如此。
發生的情況是您有另一個函式 ,ProcessRequest并且其引數的型別之一是型別為 的函式func (SignInResponse) *src.Response。
當您嘗試將型別值傳遞給func (interface{}) *src.Response接受型別引數的函式時會發生錯誤,func (SignInResponse) *src.Response因為這些引數的型別顯然不兼容。
更新。
要了解為什么引數的型別不兼容,請考慮SignInResponse并interface{}在記憶體中具有不同的存盤表示;基本上這就是為什么[]T和[]interface{}不兼容的原因,即使你可以做到t := T{}; var i interface{} = t。常見問題解答中對此進行了解釋。
至于手頭的問題,據說最簡單的方法是使用匿名函式將值“調整”SignInResponse為interface{}:傳遞給類似的ProcessResponse東西
func (r SignInResponse) *src.Response {
return myFunction2(r)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424130.html
標籤:去
