FrameworkであるRevelを使って実際にmodelを作ってみます。Revelを立ち上げるのは色々な所に投稿されておりますのでそちらをご参照ください。また、以前に投稿したinterfaceの使い方もご参照ください。
1. application作成
まずは適当な名前でアプリを作ります。今回はmyappにします。コマンドプロンプトで以下を実行します。ここまではいつも通りです。
$revel new myapp
2. models folder作成
次にmodelを入れるfolderを作成します。~go/src/myapp/app/の下にmodelsという名前でfolderを作成します。MVCに合わせるために私はmodelsにしました。
3. modelsの中身を実装する
modelsの中身を実装します。interfaceをうまく使ってpropertyはprivate設定にしmethod経由意外ではread/writeができないようにしています。またpublicなmethodとしてInitializerを実装しています。
package models
import (
"time"
)
type User interface {
// setter
SetUsername(username string)
SetNickname(nickname string)
SetEmail(email string)
// getter
GetUsername() (username string)
GetNickname() (nickname string)
GetEmail() (email string)
GetUserID() (userID string)
// public method
CreateUserID()
}
type user struct {
username string
nickname string
userID string
email string
update time.Time
}
// The method for creating the user ID
func (user *user) CreateUserID() {
user.update = time.Now()
user.userID = user.username + "_" + user.update.String()
}
// Setter
func (user *user) SetUsername(username string) {
user.username = username
}
func (user *user) SetNickname(nickname string) {
user.nickname = nickname
}
func (user *user) SetEmail(email string) {
user.email = email
}
// Getter
func (user *user) GetUsername() (username string) {
return user.username
}
func (user *user) GetNickname() (nickname string) {
return user.nickname
}
func (user *user) GetEmail() (email string) {
return user.email
}
func (user *user) GetUserID() (userID string) {
return user.userID
}
// User structure initializer
func InitUser() User {
return new(user)
}
func InitUserWith(username string, nickname string, email string) User {
return &user{username: username, nickname: nickname, email: email}
}
4. controlerの設定
modelが設計できたので次にcontrollerで読み出してみます。~go/src/myapp/app/の下にあるcontrollersのapp.goを変更していきます。2パターンのinitializerを実装したので実験してみます。
package controllers
import (
"fmt"
"github.com/robfig/revel"
"myapp/app/models"
)
type App struct {
*revel.Controller
}
func (c App) Index() revel.Result {
// Case-1
user := models.InitUser()
user.SetUsername("Cat")
user.SetNickname("BlackCat")
user.SetEmail("neko@email.com")
user.CreateUserID()
fmt.Println(
"Username:", user.GetUsername(),
"Nickname:", user.GetNickname(),
"Email:", user.GetEmail(),
"UserID:", user.GetUserID())
// Case-2
anotheruser := models.InitUserWith("Dog", "WhiteDog", "inu@email.com")
anotheruser.CreateUserID()
fmt.Println(
"Username:", anotheruser.GetUsername(),
"Nickname:", anotheruser.GetNickname(),
"Email:", anotheruser.GetEmail(),
"UserID:", anotheruser.GetUserID())
return c.Render()
}
私がはまったのは、modelsの読み込み方です。いろいろと試した結果一番短くmodelを読み込む方法は"myapp/app/models"でした。
Case-1の場合は単純な場合で引数が不要なInitUser()を使いっています。その後Setxxx() methodを使って値を設定しています。Case-2は引数を使用した例です。どちらもやっていることは同じです。
4. 結果確認
最後に実行して動作確認してみましょう。"$revel run myapp"を実行しlocalhost:9000にアクセスすると、コンパイルが始まり終了するとプロンプトにいかが出力されます。
Username: Cat Nickname: BlackCat Email: neko@email.com UserID: Cat_2014-04-19 22:17:34.213770737 +0900 JST
Username: Dog Nickname: WhiteDog Email: inu@email.com UserID: Dog_2014-04-19 22:17:34.213796161 +0900 JST
5. 今後
挙動がある程度理解できたのでDBとの接続をしてみます。もちろん接続するのはmgoを使用してmongoDBに接続してみます。