Skip to content

Commit fa21e6a

Browse files
authored
Merge pull request #740 from mistadikay/master
Fix failing build for Chinese, Japanese and German versions
2 parents 83bf29f + 8a802cf commit fa21e6a

24 files changed

+398
-185
lines changed

de/02.2.md

+29-29
Original file line numberDiff line numberDiff line change
@@ -15,36 +15,36 @@ Definiere mehrere Variablen.
1515

1616
// Definiere drei Variablen vom Typ "type"
1717
var vname1, vname2, vname3 type
18-
18+
1919
Definiere eine Variable mit einem Startwert.
2020

2121
// Definiere eine Variable mit dem Namen “variableName” vom Typ "type" und dem Wert "value"
2222
var variableName type = value
23-
23+
2424
Definiere mehrere Variablen mit einem Startwert.
2525

2626
/*
2727
Definiere drei Variablen vom Typ "type" und gib ihnen drei Startwerte.
2828
vname1 ist gleich v1, vname2 ist gleich v2, vname3 ist gleich v3
2929
*/
3030
var vname1, vname2, vname3 type = v1, v2, v3
31-
31+
3232
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:
3333

3434
/*
3535
Definiere drei Variablen vom Typ "type" und gib ihnen drei Ausgangswerte.
3636
vname1 ist gleich v1, vname2 ist gleich v2, vname3 ist gleich v3
3737
*/
3838
var vname1, vname2, vname3 = v1, v2, v3
39-
39+
4040
Schön, ich weiß das dies immer noch nicht einfach genug für Dich ist. Mal schauen, wie wir das lösen können.
4141

4242
/*
4343
Definiere drei Variablen ohne den Typ "type", ohne das Schlüsselwort "var" und gib ihnen Startwerte.
4444
vname1 ist gleich v1,vname2 ist gleich v2,vname3 ist gleich v3
4545
*/
4646
vname1, vname2, vname3 := v1, v2, v3
47-
47+
4848

4949
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()`.
5050

@@ -59,15 +59,15 @@ Wenn Du Variablen in Deinem Programm definierst, aber keine Verwendung finden, w
5959
func main() {
6060
var i int
6161
}
62-
62+
6363
## Konstanten
6464

6565
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.
6666

6767
Definiere eine Konstante wie folgt.
6868

6969
const constantName = value
70-
// Du kannst auch den Datentyp hinzufügen, wenn nötig
70+
// Du kannst auch den Datentyp hinzufügen, wenn nötig
7171
const Pi float32 = 3.1415926
7272

7373
Mehr Beispiele.
@@ -76,7 +76,7 @@ Mehr Beispiele.
7676
const i = 10000
7777
const MaxThread = 10
7878
const prefix = "astaxie_"
79-
79+
8080
## Grundlegende Datentypen
8181

8282
### Boolean
@@ -91,7 +91,7 @@ In Go nutzen wir `bool`, um Booleans (Wahrheitswerte) auszudrücken, die entwede
9191
valid := false // Kurzschreibweise einer Definition
9292
available = true // Eine Variable deklarieren
9393
}
94-
94+
9595
### Numerische Datentypen
9696

9797
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
114114
var c complex64 = 5+5i
115115
// Ausgabe: (5+5i)
116116
fmt.Printf("Der Wert ist: %v", c)
117-
117+
118118
### Strings
119119

120120
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,28 +140,28 @@ Aber was ist, wenn ich wirklich nur ein Zeichen in einem String ändern möchte?
140140
c[0] = 'c'
141141
s2 := string(c) // Wandle den Wert in eine String zurück
142142
fmt.Printf("%s\n", s2)
143-
143+
144144

145145
Nutze den `+` Operator, um zwei Strings zu verknüpfen.
146146

147147
s := "Hallo"
148148
m := " Welt"
149149
a := s + m
150150
fmt.Printf("%s\n", a)
151-
151+
152152

153153
oder auch
154154

155155
s := "Hallo"
156156
s = "c" + s[1:] // Du kannst die Werte mit Hilfe des Index nicht verändern, aber sie abfragen
157157
fmt.Printf("%s\n", s)
158-
158+
159159

160160
Was ist, wenn ein String über mehrere Zeilen verlaufen soll?
161161

162162
m := `Hallo
163163
Welt`
164-
164+
165165
`\`` wird die Zeichen in einem String escapen (d.h. mit `\` dessen Ausführung verhindern).
166166

167167
### Fehlermeldungen
@@ -172,7 +172,7 @@ Go besitzt mit `error` einen eigenen Datentyp, um mit Fehlermeldungen umzugehen.
172172
if err != nil {
173173
fmt.Print(err)
174174
}
175-
175+
176176
### Grundeliegende Datenstrukturen
177177

178178
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ö
199199
var i int
200200
var pi float32
201201
var prefix string
202-
202+
203203
Gruppierter Ansatz.
204204

205205
import(
@@ -233,8 +233,8 @@ Go besitzt das Schlüselwort `iota`, um eine Aufzählung zu starten. Der Startwe
233233
)
234234

235235
const v = iota // Sobald iota erneut auf `const` trifft, wird erneut mit `0` gestartet, also gilt v = 0.
236-
237-
const (
236+
237+
const (
238238
e, f, g = iota, iota, iota // e, f und g haben den selben Wert 0, da sie in der selben Zeile stehen.
239239
)
240240

@@ -261,7 +261,7 @@ wobei in `[n]Datentyp` das `n` die Länge des Arrays angibt. `Datentyp` ist selb
261261
fmt.Printf("Das erste Element ist %d\n", arr[0]) // Beim Auslesen des Wertes wird 42 zurückgegeben
262262
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.
263263

264-
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.
264+
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.
265265

266266
Es ist möglich, `:=` zu nutzen, um ein Array zu deklarieren.
267267

@@ -273,10 +273,10 @@ Vielleicht möchtest Du auch Arrays als Element in einem Array nutzen. Schauen w
273273

274274
// Deklariere ein zweidimensionales Array mit zwei Elementen, welche jeweils vier Elemente besitzen.
275275
doubleArray := [2][4]int{[4]int{1, 2, 3, 4}, [4]int{5, 6, 7, 8}}
276-
276+
277+
277278
// Die Dekleration kann auch ein wenig kompakter geschrieben werden.
278-
easyArray := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}}
279-
279+
{% raw %} easyArray := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}} {% endraw %}
280280

281281
Arrays sind grundlegende Datenstrukturen in Go.
282282

@@ -308,12 +308,12 @@ Nun deklarieren wir ein `slice` und vergeben Startwerte.
308308
// 'a' verweist auf die Elemente zwischen Index 3 und 5 im Array ar.
309309
a = ar[2:5]
310310
// 'a' besitzt nun die Elemente ar[2],ar[3] und ar[4]
311-
311+
312312
// 'b' ist ein weiterer Ausschnitt (Slice) vom Array ar
313313
b = ar[3:5]
314314
// 'b' besitzt nun die Elemente ar[3] und ar[4]
315315

316-
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.
316+
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.
317317

318318
Ihre zugrundeliegenden Datentypen.
319319

@@ -325,7 +325,7 @@ Slices haben bestimmte Anwendungsgebiete.
325325

326326
- Ein `slice` beginnt mit dem Index 0, `ar[:n]` gleicht `ar[0:n]`.
327327
- Der zweite Index gibt die Länge vom Slice an, wenn er ausgelassen wird. `ar[n:]` gleicht `ar[n:len(ar)]`.
328-
- Du kannst auch `ar[:]` nutzen, um einen gesamtes Array zu kopieren, wie in den ersten beiden Punkten erklärt.
328+
- Du kannst auch `ar[:]` nutzen, um einen gesamtes Array zu kopieren, wie in den ersten beiden Punkten erklärt.
329329

330330
Mehr Beispiele zu `slice`
331331

@@ -383,7 +383,7 @@ Schauen wir uns ein wenig Code an. Die 'set'- und 'get'-Werte in `map` sind der
383383
// Ein alternativer Weg zum Deklarieren
384384
nummern := make(map[string]int)
385385
nummern["eins"] = 1 // Weise ein Wert durch einen Schlüssel zu
386-
nummern["zehn"] = 10
386+
nummern["zehn"] = 10
387387
nummern["drei"] = 3
388388

389389
fmt.Println("Die dritte Nummer lautet: ", nummern["drei"]) // Lese den Wert aus
@@ -398,7 +398,7 @@ Einige Anmerkungen zur Nutzung von maps.
398398

399399
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.
400400

401-
Benutze `delete`, um ein Element in `map` zu löschen.
401+
Benutze `delete`, um ein Element in `map` zu löschen.
402402

403403
// Erstelle eine map
404404
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ä
450450
float64 0 // Die Größe beträgt 8 Byte
451451
bool false
452452
string ""
453-
453+
454454
## Links
455455

456456
- [Inhaltsverzeichnis](preface.md)
457457
- Vorheriger Abschnitt: ["Hallo Go"](02.1.md)
458-
- Nächster Abschnitt: [Kontrollstrukturen und Funktionen](02.3.md)
458+
- Nächster Abschnitt: [Kontrollstrukturen und Funktionen](02.3.md)

ja/04.3.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Goではどのようにこの効果的な防御を行なっているのでしょ
2626
図4.3 Javascriptフィルターによる出力
2727

2828
Goのhtml/templateパッケージはデフォルトでhtmlタグをフィルターします。しかし時にはこの`<script>alert()</script>`を正常な情報として出力したい場合があるかもしれません。そのような場合はどのように処理するべきでしょうか?この場合はtext/templateをご利用ください。下の例をご覧ください:
29-
29+
<!-- {% raw %} -->
3030
import "text/template"
3131
...
3232
t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
@@ -66,3 +66,4 @@ Goのhtml/templateパッケージはデフォルトでhtmlタグをフィルタ
6666
* [目次](<preface.md>)
6767
* 前へ: [入力値の検証](<04.2.md>)
6868
* 次へ: [フォームの複数回送信の防止](<04.4.md>)
69+
<!-- {% endraw %} -->

ja/04.5.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- {% raw %} -->
12
# 4.5 ファイルのアップロード処理
23

34
ユーザによるファイルのアップロードを処理したいとします。例えば、現在Instagramのようなホームページを作成しているとします。ユーザが撮影した写真を保存する必要があります。このような要求はどのように実現するのでしょうか?
@@ -115,7 +116,7 @@
115116
return err
116117
}
117118
defer fh.Close()
118-
119+
119120
//iocopy
120121
_, err = io.Copy(fileWriter, fh)
121122
if err != nil {
@@ -155,3 +156,4 @@
155156
* [目次](<preface.md>)
156157
* 前へ: [フォームの多重送信の防止](<04.4.md>)
157158
* 次へ: [まとめ](<04.6.md>)
159+
<!-- {% endraw %} -->

ja/06.4.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- {% raw %} -->
12
# 6.4 sessionハイジャックの予防
23
sessionハイジャックは広範囲に存在する比較的重大な脆弱性です。session技術において、クライアントサイドとサーバサイドはsessionのIDによってセッションを維持します。しかしこのIDは簡単にスニッフィングされ、第三者に利用されてしまいます。これは中間者攻撃の一種です。
34

@@ -87,3 +88,4 @@ sessionが始まると、生成されたsessionIDの時間を記録する一つ
8788
* [目次](<preface.md>)
8889
* 前へ: [sessionストレージ](<06.3.md>)
8990
* 次へ: [まとめ](<06.5.md>)
91+
<!-- {% endraw %} -->

ja/07.1.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- {% raw %} -->
12
# 7.1 XMLの処理
23
XMLはデータと情報のやりとりするための形式として十分普及しています。Webサービスが日々広範囲で応用されてくるにつれ、現在XMLは日常的な開発作業において重要な役割を演じてきました。この節ではGo言語の標準パッケージにあるXML関連のパッケージをご紹介します。
34

@@ -219,3 +220,4 @@ XMLをstructに解析する際は以下のルールに従います: 
219220
* [目次](<preface.md>)
220221
* 前へ: [テキスト処理](<07.0.md>)
221222
* 次へ: [Jsonの処理](<07.2.md>)
223+
<!-- {% endraw %} -->

ja/07.4.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- {% raw %} -->
12
# 7.4 テンプレートの処理
23
## テンプレートとは何か
34
おそらくあなたはMVCのデザインパターンについて聞いたことがあると思います。Modelはデータを処理を、Viewは表示結果を、Controllerはユーザのリクエストの制御を行います。Viewレイヤーの処理では、多くの動的な言語ではどれも静的なHTMLの中に動的言語が生成したデータを挿入します。例えばJSPでは`<%=....=%>`を挿入することで、PHPでは`<?php.....?>`を挿入することで実現します。
@@ -348,3 +349,4 @@ Webアプリケーションを作る時はテンプレートの一部が固定
348349
* [目次](<preface.md>)
349350
* 前へ: [正規表現の処理](<07.3.md>)
350351
* 次へ: [ファイルの操作](<07.5.md>)
352+
<!-- {% endraw %} -->

ja/09.1.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- {% raw %} -->
12
# 9.1 CSRF攻撃の予防
23

34
## CSRFとは何か 
@@ -91,3 +92,4 @@ tokenを検証
9192
* [目次](<preface.md>)
9293
* 前へ: [セキュリティと暗号化](<09.0.md>)
9394
* 次へ: [入力フィルタリングの確保](<09.2.md>)
95+
<!-- {% endraw %} -->

ja/10.2.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- {% raw %} -->
12
# 10.2 ローカライズリソース
23
前の節ではどのようにしてLocaleを設定するかご紹介しました。Localeを設定したあとはどのようにしてLocaleに対応する情報を保存するかという問題を解決する必要があります。ここでの情報とは以下の内容を含みます:テキスト情報、時間と日時、通貨の値、画像、ファイルや動画といったリソース等です。ここではこれらの情報に対してご紹介していきたいと思います。Go言語ではこれらのフォーマットの情報をJSONに保存します。その後それぞれ適した方法によって表示します。(以下では日本語と英語の2つの言語を対比して例を挙げます。保存の形式はそれぞれen.jsonとja-JP.jsonです。)
34
## ローカライズテキスト情報
@@ -132,3 +133,4 @@ Localeの違いによってビューを表示させる場合もあるかもし
132133
* [目次](<preface.md>)
133134
* 前へ: [デフォルトロケールの設定](<10.1.md>)
134135
* 次へ: [国際化サイト](<10.3.md>)
136+
<!-- {% endraw %} -->

ja/10.3.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- {% raw %} -->
12
# 10.3 国際化サイト
23
前の節でどのようにしてローカライズリソースを処理するかご紹介しました。Localeに対応した設定ファイルです。ではもし複数のローカライズリソースを処理する場合は?いくつかの我々が通常使用する例は:簡単なテキスト翻訳、時間や日時、数字といったものはどのように処理するのでしょうか?この節では一つ一つこれらの問題を解決していきます。
34
## 複数のロケールパッケージの管理
@@ -178,3 +179,4 @@
178179
* [目次](<preface.md>)
179180
* 前へ: [ローカライズリソース](<10.2.md>)
180181
* 次へ: [まとめ](<10.4.md>)
182+
<!-- {% endraw %} -->

ja/12.2.md

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
<!-- {% raw %} -->
12
# 12.2 サイトエラー処理
23
我々のWebアプリケーションが一旦実運用されると、さまざまなエラーが発生する可能性があります。Webアプリケーションの日常の実行ではいくつものエラーが発生する可能性があります。具体的には以下のとおり:
34

45
- データベースエラー:データベースサーバへのアクセスまたはデータと関係のあるエラーです。例えば、以下は何らかのデータベースエラーを発生させることがあります。
5-
6+
67
- 接続エラー:このエラーはデータベースサーバのネットワークが切断された時や、ユーザ名とパスワードが不正だった場合、またはデータベースが存在しない場合に発生することがあります。
78
- 検索エラー:使用されたSQLが正しく無く、エラーが発生する場合です。このようなSQLエラーはもしプログラムに厳格なテストを行うことで回避できます。
89
- データエラー:データベースの約束が衝突する場合。例えば一つしかないフィールドに複数の主キーを持つデータが挿入されるとエラーを発生させます。しかし、あなたのアプリケーションプログラムが運用される前に厳格なテストを行うことでこれらの問題を回避することもできます。
@@ -27,9 +28,9 @@
2728
エラー処理は実は我々も第十一章の第一節でどのようにエラー処理を設計するかご紹介しました。ここではまたひとつの例から詳細にご解説します。どのように異なるエラーを処理するのでしょうか:
2829

2930
- ユーザにエラーが発生したことを通知する:
30-
31+
3132
ユーザがページにアクセスした時はふたつのエラーがあります:404.htmlとerror.htmlです。以下はそれぞれエラーページを表示するソースです:
32-
33+
3334
<html lang="en">
3435
<head>
3536
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
@@ -51,7 +52,7 @@
5152
</body>
5253
</html>
5354
もうひとつのソース:
54-
55+
5556
<html lang="en">
5657
<head>
5758
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
@@ -72,9 +73,9 @@
7273
</div>
7374
</body>
7475
</html>
75-
76+
7677
404のエラー処理ロジック、もしシステムのエラーだった場合もにたような操作になります。以下を見てみましょう:
77-
78+
7879
func (p *MyMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
7980
if r.URL.Path == "/" {
8081
sayhelloName(w, r)
@@ -90,7 +91,7 @@
9091
ErrorInfo := "ファイルが見つかりません" //現在のユーザ情報を取得
9192
t.Execute(w, ErrorInfo) //テンプレートのmerger操作を実行
9293
}
93-
94+
9495
func SystemError(w http.ResponseWriter, r *http.Request) {
9596
log.Critical("システムエラー") //システムエラーはクリティカルですので、ログに記録するだけでなくメールを送信します。
9697
t, _ = t.ParseFiles("tmpl/error.html", nil) //テンプレートファイルを解析
@@ -109,7 +110,7 @@
109110
username = ""
110111
}
111112
}()
112-
113+
113114
username = User[uid]
114115
return
115116
}
@@ -122,3 +123,4 @@
122123
* [目次](<preface.md>)
123124
* 前へ: [アプリケーションログ](<12.1.md>)
124125
* 次へ: [アプリケーションのデプロイ](<12.3.md>)
126+
<!-- {% endraw %} -->

0 commit comments

Comments
 (0)