런타임시 지정된 함수를 테스트하여 특정 서명과 일치하는지 확인하려고합니다. 이 서명은 특정 구현이 아닌 일부 인터페이스를 준수하는 것으로 충분합니다.스위치로 인터페이스별로 기능을 확인하십시오.
나는 그런 검증을 할 올바른 패턴을 찾을 수없는 것 같습니다. 런타임에 함수의 유형이 구현을 사용하고 있습니다.
함수의 서명을 인터페이스와 어떻게 비교할 수 있습니까?
package main
import "fmt"
type myinteface interface{
DoSomething(int) string
}
type myfunc func(myinteface)
type impl struct {}
func (im *impl) DoSomething(int) string{
return "fsdfsd"
}
func do(i interface{}) {
switch v := i.(type) {
case func(myinteface):
fmt.Print("doesn't stop here")
case func(impl):
fmt.Print("this does work")
default:
fmt.Printf("I don't know about type %T!\n", v)
}
}
func test(im impl) {}
func main() {
do(test)
}
는 수동
reflect
패키지를 사용하여 인수를 입력 확인 할 수는
playground
당신에게 말하는 것은 완전히 맞습니다. 'test'는'func (myinteface)'가 아닌'func (impl)'이며'func (myinteface)'로 사용할 수 없습니다. – hobbs
나는 그것이 정확한지 알고있다. 그러나'impl '은'myinterface'를 만족 시키므로, 함수가 시그니처에 그 인터페이스의 구현을 가지고 있는지를 알고 싶다. – yarons
@hobbs가 말했던 것과 그 외 : function types Golang에서 (배열과 조각뿐만 아니라) * invariant *입니다. 이 용어로 검색하면 다양한 관련 기사가 많이 나옵니다. – zerkms