So, I have a function like this
func ProcessRequest(requestBody *SignInRequest, response func(SignInResponse) *src.Response, error func(ControllerError) *src.Response) *src.Response {
return error(ControllerError{Code: http.StatusNotImplemented})
}
And I'm trying to call this
ProcessRequest(payload, myFunction, handler.OnControllerError)
func myFunction(i interface{}) *src.Response {
}
This is showing me an error
Cannot use 'myFunction' (type func(i interface{}) *src.Response) as the type func(SignInResponse) *src.Response
But if I try the same thing with
type TestStruct struct {
}
func myFunction2(i interface{}) *src.Response {
}
myFunction2(TestStruct{})
Then it is not showing any error.
I want it to take interface{} as an argument because I want myFucntion to be general which can take any struct.
CodePudding user response:
You're confusing two things.
When you have a function with the signaure func (interface{}) *src.Response, you indeed can call it while passing it a value of any type, but that is not what happens.
What happens is that you have another function, ProcessRequest, and one of the types of its arguments is a function with the type func (SignInResponse) *src.Response.
The error happens when you try to pass a value of type func (interface{}) *src.Response to a function which accepts an argument of type func (SignInResponse) *src.Response because the types of these arguments are obviously not compatible.
Update.
To understand why the types of the arguments are not compatible, consider that SignInResponse and interface{} have different storage representation in memory; basically that's the same reason why []T and []interface{} are not compatible even when you can do t := T{}; var i interface{} = t. This one is explained in the FAQ.
As to the problem at hand, supposedly the easiest approach is to use an anonymous function to "adapt" the value SignInResponse to interface{}: pass to ProcessResponse something like
func (r SignInResponse) *src.Response {
return myFunction2(r)
}
