diff --git a/de/02.2.md b/de/02.2.md
index 198f79b2..4a640fc4 100644
--- a/de/02.2.md
+++ b/de/02.2.md
@@ -15,12 +15,12 @@ Definiere mehrere Variablen.
// Definiere drei Variablen vom Typ "type"
var vname1, vname2, vname3 type
-
+
Definiere eine Variable mit einem Startwert.
// Definiere eine Variable mit dem Namen “variableName” vom Typ "type" und dem Wert "value"
var variableName type = value
-
+
Definiere mehrere Variablen mit einem Startwert.
/*
@@ -28,7 +28,7 @@ Definiere mehrere Variablen mit einem Startwert.
vname1 ist gleich v1, vname2 ist gleich v2, vname3 ist gleich v3
*/
var vname1, vname2, vname3 type = v1, v2, v3
-
+
Findest Du es nicht auch ein wenig mühsehlig, Variablen auf diesem Weg zu definieren? Keine Sorge, denn das Team hinter Go hat auch so gedacht. Daher kannst Du Variablen Startwerte geben, ohne explizit den Datentyp zu definieren. Der Code würde dann so aussehen:
/*
@@ -36,7 +36,7 @@ Findest Du es nicht auch ein wenig mühsehlig, Variablen auf diesem Weg zu defin
vname1 ist gleich v1, vname2 ist gleich v2, vname3 ist gleich v3
*/
var vname1, vname2, vname3 = v1, v2, v3
-
+
Schön, ich weiß das dies immer noch nicht einfach genug für Dich ist. Mal schauen, wie wir das lösen können.
/*
@@ -44,7 +44,7 @@ Schön, ich weiß das dies immer noch nicht einfach genug für Dich ist. Mal sch
vname1 ist gleich v1,vname2 ist gleich v2,vname3 ist gleich v3
*/
vname1, vname2, vname3 := v1, v2, v3
-
+
So sieht es schon viel besser aus. Nutze `:=`, um `var` und `type` zu ersetzen. Es handelt sich hierbei um eine Kurzschreibweise. Aber warte, es gibt einen kleinen Haken: diese Form der Definition kann nur innerhalb von Fuktionen genutzt werden. Der Compiler wird sonst eine Fehlermeldung ausgeben, wenn Du es trotzdem außerhalb der `{}` einer Funktion versuchst. Daher nutzen wir meist das Schlüsselwort `var` um globale Variablen zu definieren oder die Funktion `var()`.
@@ -59,7 +59,7 @@ Wenn Du Variablen in Deinem Programm definierst, aber keine Verwendung finden, w
func main() {
var i int
}
-
+
## Konstanten
Konstanten sind Werte, die während der Kompilierung festgelegt werden und während der Laufzeit nicht veränderbar sind. In Go kannst Du Konstanten als Wert Nummern, Booleans oder Strings geben.
@@ -67,7 +67,7 @@ Konstanten sind Werte, die während der Kompilierung festgelegt werden und währ
Definiere eine Konstante wie folgt.
const constantName = value
- // Du kannst auch den Datentyp hinzufügen, wenn nötig
+ // Du kannst auch den Datentyp hinzufügen, wenn nötig
const Pi float32 = 3.1415926
Mehr Beispiele.
@@ -76,7 +76,7 @@ Mehr Beispiele.
const i = 10000
const MaxThread = 10
const prefix = "astaxie_"
-
+
## Grundlegende Datentypen
### Boolean
@@ -91,7 +91,7 @@ In Go nutzen wir `bool`, um Booleans (Wahrheitswerte) auszudrücken, die entwede
valid := false // Kurzschreibweise einer Definition
available = true // Eine Variable deklarieren
}
-
+
### Numerische Datentypen
Der Datentyp Integer (ganze Zahlen) kann sowohl den positiven, als auch den negativen Zahlenraum umfassen, was durch ein Vorzeichen kenntlich gemacht wird. Go besitzt `int` und `uint`, welche den selben Wertebereich haben. Dessen Größe hängt aber vom Betriebssystem ab. Es werden 32-Bit unter 32-Bit Betriebssystemen verwendet und 64-Bit unter 64-Bit Betriebssystemen. Go umfasst außerdem Datentypen mit einer spezifischen Länge: `rune`, `int8`, `int16`, `int32`, `int64`, `byte`, `uint8`, `uint16`, `uint32` und `uint64`. Bedenke, dass `rune` ein Alias für `int32` ist und `byte` dem `uint8` gleicht.
@@ -114,7 +114,7 @@ War das schon alles? Nein! Go unterstützt auch komplexe Zahlen. `complex128` (b
var c complex64 = 5+5i
// Ausgabe: (5+5i)
fmt.Printf("Der Wert ist: %v", c)
-
+
### Strings
Wir sprachen vorhin darüber, das Go eine native UTF-8 Unterstützung mit sich bringt. Strings (Zeichenketten) werden durch Anführungszeichen `""` gekennzeichet, oder durch Backticks (rückwärts geneigtes Hochkomma) ``` `` ```.
@@ -140,7 +140,7 @@ Aber was ist, wenn ich wirklich nur ein Zeichen in einem String ändern möchte?
c[0] = 'c'
s2 := string(c) // Wandle den Wert in eine String zurück
fmt.Printf("%s\n", s2)
-
+
Nutze den `+` Operator, um zwei Strings zu verknüpfen.
@@ -148,20 +148,20 @@ Nutze den `+` Operator, um zwei Strings zu verknüpfen.
m := " Welt"
a := s + m
fmt.Printf("%s\n", a)
-
+
oder auch
s := "Hallo"
s = "c" + s[1:] // Du kannst die Werte mit Hilfe des Index nicht verändern, aber sie abfragen
fmt.Printf("%s\n", s)
-
+
Was ist, wenn ein String über mehrere Zeilen verlaufen soll?
m := `Hallo
Welt`
-
+
`\`` wird die Zeichen in einem String escapen (d.h. mit `\` dessen Ausführung verhindern).
### Fehlermeldungen
@@ -172,7 +172,7 @@ Go besitzt mit `error` einen eigenen Datentyp, um mit Fehlermeldungen umzugehen.
if err != nil {
fmt.Print(err)
}
-
+
### Grundeliegende Datenstrukturen
Die folgende Grafik enstammt dem Artikel [Datenstrukturen in Go](http://research.swtch.com/godata) (auf englisch) aus [Russ Coxs Blog](http://research.swtch.com/). Wie Du sehen kannst, nutzt Go Abschnitte des Arbeitsspeichers, um Daten zu speichern.
@@ -199,7 +199,7 @@ Wenn Du mehrere Konstanten und Variablen deklarieren oder Pakete importieren mö
var i int
var pi float32
var prefix string
-
+
Gruppierter Ansatz.
import(
@@ -233,8 +233,8 @@ Go besitzt das Schlüselwort `iota`, um eine Aufzählung zu starten. Der Startwe
)
const v = iota // Sobald iota erneut auf `const` trifft, wird erneut mit `0` gestartet, also gilt v = 0.
-
- const (
+
+ const (
e, f, g = iota, iota, iota // e, f und g haben den selben Wert 0, da sie in der selben Zeile stehen.
)
@@ -261,7 +261,7 @@ wobei in `[n]Datentyp` das `n` die Länge des Arrays angibt. `Datentyp` ist selb
fmt.Printf("Das erste Element ist %d\n", arr[0]) // Beim Auslesen des Wertes wird 42 zurückgegeben
fmt.Printf("Das letzte Element ist %d\n", arr[9]) // Es gibt den Standardwert des 10. Elements zurück, was in diesem Fall 0 ist.
-Da die Länge ein Teil des Array-Typs ist, sind `[3]int` und `[4]int` verschieden, sodass wir die Länge eines Arrays nicht ändern können. Nutzt Du Arrays als Argument in einer Funktion, dann wird eine Kopie des Arrays übergeben, statt einem Zeiger (bzw. ein Verweis) auf das Original. Möchtest Du stattdessen den Zeiger übergeben, dann musst Du einen `slice` verwenden. Darauf gehen wir aber später nochmals ein.
+Da die Länge ein Teil des Array-Typs ist, sind `[3]int` und `[4]int` verschieden, sodass wir die Länge eines Arrays nicht ändern können. Nutzt Du Arrays als Argument in einer Funktion, dann wird eine Kopie des Arrays übergeben, statt einem Zeiger (bzw. ein Verweis) auf das Original. Möchtest Du stattdessen den Zeiger übergeben, dann musst Du einen `slice` verwenden. Darauf gehen wir aber später nochmals ein.
Es ist möglich, `:=` zu nutzen, um ein Array zu deklarieren.
@@ -273,10 +273,10 @@ Vielleicht möchtest Du auch Arrays als Element in einem Array nutzen. Schauen w
// Deklariere ein zweidimensionales Array mit zwei Elementen, welche jeweils vier Elemente besitzen.
doubleArray := [2][4]int{[4]int{1, 2, 3, 4}, [4]int{5, 6, 7, 8}}
-
+
+
// Die Dekleration kann auch ein wenig kompakter geschrieben werden.
- easyArray := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}}
-
+{% raw %} easyArray := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}} {% endraw %}
Arrays sind grundlegende Datenstrukturen in Go.
@@ -308,12 +308,12 @@ Nun deklarieren wir ein `slice` und vergeben Startwerte.
// 'a' verweist auf die Elemente zwischen Index 3 und 5 im Array ar.
a = ar[2:5]
// 'a' besitzt nun die Elemente ar[2],ar[3] und ar[4]
-
+
// 'b' ist ein weiterer Ausschnitt (Slice) vom Array ar
b = ar[3:5]
// 'b' besitzt nun die Elemente ar[3] und ar[4]
-Beachte die Unterscheide bei der Deklaration von `slice` und `array`. Wir nutzen `[…]`, um Go die Länge automatisch herausfinden zu lassen, aber nutzen `[]` lediglich zur Deklaration von Slices.
+Beachte die Unterscheide bei der Deklaration von `slice` und `array`. Wir nutzen `[…]`, um Go die Länge automatisch herausfinden zu lassen, aber nutzen `[]` lediglich zur Deklaration von Slices.
Ihre zugrundeliegenden Datentypen.
@@ -325,7 +325,7 @@ Slices haben bestimmte Anwendungsgebiete.
- Ein `slice` beginnt mit dem Index 0, `ar[:n]` gleicht `ar[0:n]`.
- Der zweite Index gibt die Länge vom Slice an, wenn er ausgelassen wird. `ar[n:]` gleicht `ar[n:len(ar)]`.
-- Du kannst auch `ar[:]` nutzen, um einen gesamtes Array zu kopieren, wie in den ersten beiden Punkten erklärt.
+- Du kannst auch `ar[:]` nutzen, um einen gesamtes Array zu kopieren, wie in den ersten beiden Punkten erklärt.
Mehr Beispiele zu `slice`
@@ -383,7 +383,7 @@ Schauen wir uns ein wenig Code an. Die 'set'- und 'get'-Werte in `map` sind der
// Ein alternativer Weg zum Deklarieren
nummern := make(map[string]int)
nummern["eins"] = 1 // Weise ein Wert durch einen Schlüssel zu
- nummern["zehn"] = 10
+ nummern["zehn"] = 10
nummern["drei"] = 3
fmt.Println("Die dritte Nummer lautet: ", nummern["drei"]) // Lese den Wert aus
@@ -398,7 +398,7 @@ Einige Anmerkungen zur Nutzung von maps.
Du kannst das Schema `Schlüssel:Wert` nutzen, um eine `map` mit Startwerten zu erstellen. `map` hat auch eingebaute Funktionen, um die Existenz eines `key` zu überprüfen.
-Benutze `delete`, um ein Element in `map` zu löschen.
+Benutze `delete`, um ein Element in `map` zu löschen.
// Erstelle eine map
bewertung := map[string]float32 {"C":5, "Go":4.5, "Python":4.5, "C++":2 }
@@ -450,9 +450,9 @@ Standardwerte besitzen einen Wert. Dies sind die gebräuchlichsten Anwendungsfä
float64 0 // Die Größe beträgt 8 Byte
bool false
string ""
-
+
## Links
- [Inhaltsverzeichnis](preface.md)
- Vorheriger Abschnitt: ["Hallo Go"](02.1.md)
-- Nächster Abschnitt: [Kontrollstrukturen und Funktionen](02.3.md)
\ No newline at end of file
+- Nächster Abschnitt: [Kontrollstrukturen und Funktionen](02.3.md)
diff --git a/ja/04.3.md b/ja/04.3.md
index f8818f8c..bdbf5816 100644
--- a/ja/04.3.md
+++ b/ja/04.3.md
@@ -26,7 +26,7 @@ Goではどのようにこの効果的な防御を行なっているのでしょ
図4.3 Javascriptフィルターによる出力
Goのhtml/templateパッケージはデフォルトでhtmlタグをフィルターします。しかし時にはこの``を正常な情報として出力したい場合があるかもしれません。そのような場合はどのように処理するべきでしょうか?この場合はtext/templateをご利用ください。下の例をご覧ください:
-
+
import "text/template"
...
t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
@@ -66,3 +66,4 @@ Goのhtml/templateパッケージはデフォルトでhtmlタグをフィルタ
* [目次]()
* 前へ: [入力値の検証](<04.2.md>)
* 次へ: [フォームの複数回送信の防止](<04.4.md>)
+
diff --git a/ja/04.5.md b/ja/04.5.md
index 7bf16234..4e11b87b 100644
--- a/ja/04.5.md
+++ b/ja/04.5.md
@@ -1,3 +1,4 @@
+
# 4.5 ファイルのアップロード処理
ユーザによるファイルのアップロードを処理したいとします。例えば、現在Instagramのようなホームページを作成しているとします。ユーザが撮影した写真を保存する必要があります。このような要求はどのように実現するのでしょうか?
@@ -115,7 +116,7 @@
return err
}
defer fh.Close()
-
+
//iocopy
_, err = io.Copy(fileWriter, fh)
if err != nil {
@@ -155,3 +156,4 @@
* [目次]()
* 前へ: [フォームの多重送信の防止](<04.4.md>)
* 次へ: [まとめ](<04.6.md>)
+
diff --git a/ja/06.4.md b/ja/06.4.md
index 312bbae8..4649f8e1 100644
--- a/ja/06.4.md
+++ b/ja/06.4.md
@@ -1,3 +1,4 @@
+
# 6.4 sessionハイジャックの予防
sessionハイジャックは広範囲に存在する比較的重大な脆弱性です。session技術において、クライアントサイドとサーバサイドはsessionのIDによってセッションを維持します。しかしこのIDは簡単にスニッフィングされ、第三者に利用されてしまいます。これは中間者攻撃の一種です。
@@ -87,3 +88,4 @@ sessionが始まると、生成されたsessionIDの時間を記録する一つ
* [目次]()
* 前へ: [sessionストレージ](<06.3.md>)
* 次へ: [まとめ](<06.5.md>)
+
diff --git a/ja/07.1.md b/ja/07.1.md
index 29424aee..a2158879 100644
--- a/ja/07.1.md
+++ b/ja/07.1.md
@@ -1,3 +1,4 @@
+
# 7.1 XMLの処理
XMLはデータと情報のやりとりするための形式として十分普及しています。Webサービスが日々広範囲で応用されてくるにつれ、現在XMLは日常的な開発作業において重要な役割を演じてきました。この節ではGo言語の標準パッケージにあるXML関連のパッケージをご紹介します。
@@ -219,3 +220,4 @@ XMLをstructに解析する際は以下のルールに従います:
* [目次]()
* 前へ: [テキスト処理](<07.0.md>)
* 次へ: [Jsonの処理](<07.2.md>)
+
diff --git a/ja/07.4.md b/ja/07.4.md
index 61e95da3..7b1c2eff 100644
--- a/ja/07.4.md
+++ b/ja/07.4.md
@@ -1,3 +1,4 @@
+
# 7.4 テンプレートの処理
## テンプレートとは何か
おそらくあなたはMVCのデザインパターンについて聞いたことがあると思います。Modelはデータを処理を、Viewは表示結果を、Controllerはユーザのリクエストの制御を行います。Viewレイヤーの処理では、多くの動的な言語ではどれも静的なHTMLの中に動的言語が生成したデータを挿入します。例えばJSPでは`<%=....=%>`を挿入することで、PHPでは``を挿入することで実現します。
@@ -348,3 +349,4 @@ Webアプリケーションを作る時はテンプレートの一部が固定
* [目次]()
* 前へ: [正規表現の処理](<07.3.md>)
* 次へ: [ファイルの操作](<07.5.md>)
+
diff --git a/ja/09.1.md b/ja/09.1.md
index 25ef0df6..9d543f8d 100644
--- a/ja/09.1.md
+++ b/ja/09.1.md
@@ -1,3 +1,4 @@
+
# 9.1 CSRF攻撃の予防
## CSRFとは何か
@@ -91,3 +92,4 @@ tokenを検証
* [目次]()
* 前へ: [セキュリティと暗号化](<09.0.md>)
* 次へ: [入力フィルタリングの確保](<09.2.md>)
+
diff --git a/ja/10.2.md b/ja/10.2.md
index e693acb2..7db10062 100644
--- a/ja/10.2.md
+++ b/ja/10.2.md
@@ -1,3 +1,4 @@
+
# 10.2 ローカライズリソース
前の節ではどのようにしてLocaleを設定するかご紹介しました。Localeを設定したあとはどのようにしてLocaleに対応する情報を保存するかという問題を解決する必要があります。ここでの情報とは以下の内容を含みます:テキスト情報、時間と日時、通貨の値、画像、ファイルや動画といったリソース等です。ここではこれらの情報に対してご紹介していきたいと思います。Go言語ではこれらのフォーマットの情報をJSONに保存します。その後それぞれ適した方法によって表示します。(以下では日本語と英語の2つの言語を対比して例を挙げます。保存の形式はそれぞれen.jsonとja-JP.jsonです。)
## ローカライズテキスト情報
@@ -132,3 +133,4 @@ Localeの違いによってビューを表示させる場合もあるかもし
* [目次]()
* 前へ: [デフォルトロケールの設定](<10.1.md>)
* 次へ: [国際化サイト](<10.3.md>)
+
diff --git a/ja/10.3.md b/ja/10.3.md
index dea1ecda..ed517a3c 100644
--- a/ja/10.3.md
+++ b/ja/10.3.md
@@ -1,3 +1,4 @@
+
# 10.3 国際化サイト
前の節でどのようにしてローカライズリソースを処理するかご紹介しました。Localeに対応した設定ファイルです。ではもし複数のローカライズリソースを処理する場合は?いくつかの我々が通常使用する例は:簡単なテキスト翻訳、時間や日時、数字といったものはどのように処理するのでしょうか?この節では一つ一つこれらの問題を解決していきます。
## 複数のロケールパッケージの管理
@@ -178,3 +179,4 @@
* [目次]()
* 前へ: [ローカライズリソース](<10.2.md>)
* 次へ: [まとめ](<10.4.md>)
+
diff --git a/ja/12.2.md b/ja/12.2.md
index 3e1c0d05..c6201707 100644
--- a/ja/12.2.md
+++ b/ja/12.2.md
@@ -1,8 +1,9 @@
+
# 12.2 サイトエラー処理
我々のWebアプリケーションが一旦実運用されると、さまざまなエラーが発生する可能性があります。Webアプリケーションの日常の実行ではいくつものエラーが発生する可能性があります。具体的には以下のとおり:
- データベースエラー:データベースサーバへのアクセスまたはデータと関係のあるエラーです。例えば、以下は何らかのデータベースエラーを発生させることがあります。
-
+
- 接続エラー:このエラーはデータベースサーバのネットワークが切断された時や、ユーザ名とパスワードが不正だった場合、またはデータベースが存在しない場合に発生することがあります。
- 検索エラー:使用されたSQLが正しく無く、エラーが発生する場合です。このようなSQLエラーはもしプログラムに厳格なテストを行うことで回避できます。
- データエラー:データベースの約束が衝突する場合。例えば一つしかないフィールドに複数の主キーを持つデータが挿入されるとエラーを発生させます。しかし、あなたのアプリケーションプログラムが運用される前に厳格なテストを行うことでこれらの問題を回避することもできます。
@@ -27,9 +28,9 @@
エラー処理は実は我々も第十一章の第一節でどのようにエラー処理を設計するかご紹介しました。ここではまたひとつの例から詳細にご解説します。どのように異なるエラーを処理するのでしょうか:
- ユーザにエラーが発生したことを通知する:
-
+
ユーザがページにアクセスした時はふたつのエラーがあります:404.htmlとerror.htmlです。以下はそれぞれエラーページを表示するソースです:
-
+
@@ -51,7 +52,7 @@
もうひとつのソース:
-
+
@@ -72,9 +73,9 @@
-
+
404のエラー処理ロジック、もしシステムのエラーだった場合もにたような操作になります。以下を見てみましょう:
-
+
func (p *MyMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
sayhelloName(w, r)
@@ -90,7 +91,7 @@
ErrorInfo := "ファイルが見つかりません" //現在のユーザ情報を取得
t.Execute(w, ErrorInfo) //テンプレートのmerger操作を実行
}
-
+
func SystemError(w http.ResponseWriter, r *http.Request) {
log.Critical("システムエラー") //システムエラーはクリティカルですので、ログに記録するだけでなくメールを送信します。
t, _ = t.ParseFiles("tmpl/error.html", nil) //テンプレートファイルを解析
@@ -109,7 +110,7 @@
username = ""
}
}()
-
+
username = User[uid]
return
}
@@ -122,3 +123,4 @@
* [目次]()
* 前へ: [アプリケーションログ](<12.1.md>)
* 次へ: [アプリケーションのデプロイ](<12.3.md>)
+
diff --git a/ja/13.3.md b/ja/13.3.md
index 9e1e1458..f772e3c9 100644
--- a/ja/13.3.md
+++ b/ja/13.3.md
@@ -1,3 +1,4 @@
+
# 13.3 controller設計
伝統的なMVCフレームワークにおいて、多くの場合Action設計のサフィックス反映にもとづいています、しかしながら、現在webではREST風のフレームワークが流行しています。なるべくFilterかrewriteを使用してURLのリライトを行い、REST風のURLを実現しています。しかしなぜ直接新しくREST風のMVCフレームワークを設計しないのでしょうか?本章ではこういった考え方に基いてどのようにREST風のMVCフレームワークにフルスクラッチでcontroller、最大限に簡素化されたWebアプリケーションの開発、ひいては一行で可能な"Hello, world"の実装についてご説明します。
@@ -17,7 +18,7 @@ MVC設計は現在Webアプリケーションの開発において最もよく
Layout []string
TplExt string
}
-
+
type ControllerInterface interface {
Init(ct *Context, cn string) //コンテキストとサブクラスの名前を初期化
Prepare() //実行前のいくつかの処理を開始
@@ -31,7 +32,7 @@ MVC設計は現在Webアプリケーションの開発において最もよく
Finish() //実行完了後の処理
Render() error //methodが対応する方法を実行し終えた後、ページを構築
}
-
+
前にadd関数へのルータをご紹介した際ControllerInterfaceクラスを定義しました。ですので、ここではこのインターフェースを実装すれば十分です。基底クラスのContorollerの実装は以下のようなメソッドになります:
func (c *Controller) Init(ct *Context, cn string) {
@@ -42,43 +43,43 @@ MVC設計は現在Webアプリケーションの開発において最もよく
c.Ct = ct
c.TplExt = "tpl"
}
-
+
func (c *Controller) Prepare() {
-
+
}
-
+
func (c *Controller) Finish() {
-
+
}
-
+
func (c *Controller) Get() {
http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405)
}
-
+
func (c *Controller) Post() {
http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405)
}
-
+
func (c *Controller) Delete() {
http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405)
}
-
+
func (c *Controller) Put() {
http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405)
}
-
+
func (c *Controller) Head() {
http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405)
}
-
+
func (c *Controller) Patch() {
http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405)
}
-
+
func (c *Controller) Options() {
http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405)
}
-
+
func (c *Controller) Render() error {
if len(c.Layout) > 0 {
var filenames []string
@@ -108,10 +109,10 @@ MVC設計は現在Webアプリケーションの開発において最もよく
}
return nil
}
-
+
func (c *Controller) Redirect(url string, code int) {
c.Ct.Redirect(code, url)
- }
+ }
上のcontroller基底クラスはインターフェースが定義する関数を実装しています。urlにもとづいてルータが対応するcontrollerを実行する原則に従って、以下のように実行されます:
@@ -125,21 +126,21 @@ MVC設計は現在Webアプリケーションの開発において最もよく
上ではbeegoフレームワークにおいてcontroller基底クラスの設計を完成させました。我々のアプリケーションでは我々のメソッドを以下のように設計することができます:
package controllers
-
+
import (
"github.com/astaxie/beego"
)
-
+
type MainController struct {
beego.Controller
}
-
+
func (this *MainController) Get() {
this.Data["Username"] = "astaxie"
this.Data["Email"] = "astaxie@gmail.com"
this.TplNames = "index.tpl"
}
-
+
上のメソッドではサブクラスMainControllerを実装し、Getメソッドを実装しています。もしユーザがその他のメソッド(POST/HEAD等)によってこのリソースにアクセスすると、403を返します。もしGetであれば、AutoRender=trueを設定していますのでGetメソッドの実行後自動的にRender関数が実行され、以下のようなインターフェースが表示されます:

@@ -161,3 +162,4 @@ index.tplのコードは以下のようになります。データの設定と
* [目次]()
* 前へ: [カスタム定義のルータの設計](<13.2.md>)
* 次へ: [ログとコンフィグ設計](<13.4.md>)
+
diff --git a/ja/13.5.md b/ja/13.5.md
index b465aee8..332ef9ec 100644
--- a/ja/13.5.md
+++ b/ja/13.5.md
@@ -1,3 +1,4 @@
+
# 13.5 ブログの追加/削除/修正の実装
前ではbeegoフレームワークの全体的な構造思想の実装とニセコードの一部の実装についてご紹介しました。この節ではbeegoを通してブログシステムを設計しましょう。これにはブログの閲覧、追加、修正、削除といった操作が含まれます。
@@ -52,19 +53,19 @@ IndexController:
type IndexController struct {
beego.Controller
}
-
+
func (this *IndexController) Get() {
this.Data["blogs"] = models.GetAll()
this.Layout = "layout.tpl"
this.TplNames = "index.tpl"
}
-
+
ViewController:
type ViewController struct {
beego.Controller
}
-
+
func (this *ViewController) Get() {
id, _ := strconv.Atoi(this.Ctx.Input.Params[":id"])
this.Data["Post"] = models.GetBlog(id)
@@ -77,12 +78,12 @@ NewController
type NewController struct {
beego.Controller
}
-
+
func (this *NewController) Get() {
this.Layout = "layout.tpl"
this.TplNames = "new.tpl"
}
-
+
func (this *NewController) Post() {
inputs := this.Input()
var blog models.Blog
@@ -98,14 +99,14 @@ EditController
type EditController struct {
beego.Controller
}
-
+
func (this *EditController) Get() {
id, _ := strconv.Atoi(this.Ctx.Input.Params[":id"])
this.Data["Post"] = models.GetBlog(id)
this.Layout = "layout.tpl"
this.TplNames = "edit.tpl"
}
-
+
func (this *EditController) Post() {
inputs := this.Input()
var blog models.Blog
@@ -116,39 +117,39 @@ EditController
models.SaveBlog(blog)
this.Ctx.Redirect(302, "/")
}
-
+
DeleteController
type DeleteController struct {
beego.Controller
}
-
+
func (this *DeleteController) Get() {
id, _ := strconv.Atoi(this.Ctx.Input.Params[":id"])
blog := models.GetBlog(id)
this.Data["Post"] = blog
models.DelBlog(blog)
this.Ctx.Redirect(302, "/")
- }
+ }
## modelレイヤ
package models
-
+
import (
"database/sql"
"github.com/astaxie/beedb"
_ "github.com/ziutek/mymysql/godrv"
"time"
)
-
+
type Blog struct {
Id int `PK`
Title string
Content string
Created time.Time
}
-
+
func GetLink() beedb.Model {
db, err := sql.Open("mymysql", "blog/astaxie/123456")
if err != nil {
@@ -157,25 +158,25 @@ DeleteController
orm := beedb.New(db)
return orm
}
-
+
func GetAll() (blogs []Blog) {
db := GetLink()
db.FindAll(&blogs)
return
}
-
+
func GetBlog(id int) (blog Blog) {
db := GetLink()
db.Where("id=?", id).Find(&blog)
return
}
-
+
func SaveBlog(blog Blog) (bg Blog) {
db := GetLink()
db.Save(&blog)
return bg
}
-
+
func DelBlog(blog Blog) {
db := GetLink()
db.Delete(&blog)
@@ -198,17 +199,17 @@ layout.tpl
-
+
-
+
{{.LayoutContent}}
-
+