2017-04-19 6 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

これは、これほど多くの構造化設定の質問の複製としてマークしていないことをうれしく思います。これは確かに若干の微妙な違いがあります。 – RayfenWindspear

関連する問題