2017-04-19 8 views
0

Go를 배우는 동안 MVC 아키텍처를 이해하려고 노력 중이며 컨트롤러에서 모델의 값을 변경하려고합니다.Setter가 모델에서 작동하지 않습니다.

코드는 문자열 만 보유하는 모델을 생성합니다. 뷰는 해당 문자열을 터미널에 표시하지만 컨트롤러는 변경할 수 없습니다 (아무런 문제없이 사용자 입력을받습니다).

오른쪽 지금은 터미널에 도착 텍스트는 다음과 같이이다 :

Hello World! 
asdf //my input 
Hello World! 

내가 좀하고 싶습니다 출력은 다음과 같이 될 것이다 : 여기

Hello World! 
asdf //my input 
asdf 

내 파일입니다

model.go

package models 

type IndexModel struct { 
    Text string 
} 

func (m *IndexModel) InitModel() string { 
    return m.Text 
} 

func (m *IndexModel) SetText(newText string) { 
    m.Text = newText 
} 

view.go

package views 

import "github.com/jufracaqui/mvc_template/app/models" 

type IndexView struct { 
    Model models.IndexModel 
} 

func (v IndexView) Output() string { 
    return v.Model.Text 
} 

controller.go

package controllers 

import "github.com/jufracaqui/mvc_template/app/models" 

type IndexController struct { 
    Model models.IndexModel 
} 

func (c IndexController) ChangeText(userInput string) { 
    c.Model.SetText(userInput) 
} 

main.go :

package main 

import (
    "bufio" 
    "os" 

    "fmt" 

    "github.com/jufracaqui/mvc_template/app/controllers" 
    "github.com/jufracaqui/mvc_template/app/models" 
    "github.com/jufracaqui/mvc_template/app/views" 
) 

func main() { 
    handleIndex() 
} 

func handleIndex() { 
    model := models.IndexModel{ 
     "Hello World!", 
    } 

    controller := controllers.IndexController{ 
     model, 
    } 

    viewIndex := views.IndexView{ 
     model, 
    } 

    fmt.Println(viewIndex.Model.Text) 

    reader := bufio.NewReader(os.Stdin) 
    text, _ := reader.ReadString('\n') 
    controller.ChangeText(text) 
    fmt.Println(viewIndex.Model.Text) 
} 

편집 :

: 내 코드 @JimB 응답 후 결국 어떻게

model.go :

package models 

type IndexModel struct { 
    Text string 
} 

func (m *IndexModel) InitModel() string { 
    return m.Text 
} 

view.go :

package views 

import "github.com/jufracaqui/mvc_template/app/models" 

type IndexView struct { 
    Model *models.IndexModel 
} 

func (v IndexView) Output() string { 
    return v.Model.Text 
} 

controller.go :

package controllers 

import "github.com/jufracaqui/mvc_template/app/models" 

type IndexController struct { 
    Model *models.IndexModel 
} 

func (c IndexController) ChangeText(userInput string) { 
    c.Model.Text = userImput 
} 
main.go

:

package main 

import (
    "bufio" 
    "os" 

    "fmt" 

    "github.com/jufracaqui/mvc_template/app/controllers" 
    "github.com/jufracaqui/mvc_template/app/models" 
    "github.com/jufracaqui/mvc_template/app/views" 
) 

func main() { 
    handleIndex() 
} 

func handleIndex() { 
    model := models.IndexModel{ 
     "Hello World!", 
    } 

    m := &model 

    controller := controllers.IndexController{ 
     m, 
    } 

    viewIndex := views.IndexView{ 
     m, 
    } 

    fmt.Println(viewIndex.Model.Text) 

    reader := bufio.NewReader(os.Stdin) 
    text, _ := reader.ReadString('\n') 
    controller.ChangeText(text) 
    fmt.Println(viewIndex.Model.Text) 
} 

답변

7

IndexController.ChangeText 포인터 수신기를 필요로하거나 IndexController.Model 요구 포인터. SetText 값의 복사본에 SetText을 호출하고 있습니다.

변경 가능한 것으로 예상되는 경우, 전체적으로 구조체에 대한 포인터를 일관되게 사용하고 필요할 때 명시 적 구조체 값을 예외로 만드는 것이 훨씬 쉽습니다.

+1

나는 이것을 매우 많은 struct setter 질문의 중복으로 표시하지 않았기 때문에 기쁩니다. 이것은 실제로 약간의 미묘한 차이가 있습니다. – RayfenWindspear