2015-01-25 2 views
0

golang에 MVC를 구현하고 싶습니다. 그러나 내가 원하는 것을 성취하는 것이 어려워 보인다. Testcontroller.go에 제가 있습니다..golang에서 문자열에 따라 differenct 유형을 인스턴스화 할 수 있습니까?

func (c *TestController) Test() { 
    // 
} 

func (c *TestController) Index() { 
    // 
} 

전용 제어기로, 그 기능을 실행 reflect.ValueOf (TestController {}) MethodByName() 호출()를 사용할 수있다. 이제 다른 컨트롤러를 추가하고 싶습니다.

controllerName := strings.Split(r.URL.Path, "/") 
controller = reflect.ValueOf(controllerName[1]) 

나는이 totaly 잘못 알고,하지만 난 컨트롤러 명을 "테스트"== 경우 TestController 인스턴스를 가져오고 인 IndexController 인스턴스를 얻을 수 있기를 바랍니다 :하지만 다른 문자열로 내가 할 수있는 새로운 것은 다른 인스턴스처럼 보인다 컨트롤러 이름 == "인덱스"인 경우 반영을 사용하면 원하는 것을 얻을 수없는 것처럼 보입니다. 할 수있는 방법이 있습니까? 대단히 감사합니다!

+0

당신은 항상 사용할 수있는 경우, 그렇지 않은/스위치 문 (들). – ThinkChaos

+0

그건 좋은 선택이 아니야. –

+1

나는 인터페이스를 사용할 것이다 : 그리고 인터페이스는지도 나 다른 것들에 색인을 붙일 수있는 이름으로 컨트롤러를 식별한다. (숫자가 매우 적 으면 단순히 스캔하는 것이 더 효율적 일지 모르지만 그들 모두). 함수를 호출 할 때는 반영을 사용할 수 있습니다. –

답변

2

당신은 그런 일 할 수있는 :

이 컨트롤러의 인터페이스를 정의 : 컨트롤러에서

type Controller interface { 
    // Route returns the root route for that controller 
    Route() string 
} 

을 그냥 구현 :

// this tells our app what's the route for this controller 
func (c *TestController) Route() string { 
    return "test" 
} 

func (c *TestController) Test() { 
    // 
} 

func (c *TestController) Index() { 
    // 
} 

를 우리의 응용 프로그램에서 레지스트리를 생성 귀하의 컨트롤러를 찾아 볼 수 있습니다.

var controllers = make([]Controller, 0) 

// register them somehow 
서빙 과정에서 5,

그리고 지금 :

// assuming the path is /<controller>/<method> 
controllerName := strings.Split(r.URL.Path, "/") 

// again, you can use a map here, but for a few controllers it's not worth it probably 
for _, c := range controllers { 
    if c.Route() == controllerName[1] { 

     // do what you did in the single controller example 
     callControllerWithReflection(c, controllerName[2]) 
    } 
} 
관련 문제