diff --git a/.gitignore b/.gitignore
index b2eb862a..ba5aedb9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,7 @@
pkg/*
*.html
*.exe
-<<<<<<< HEAD
-=======
-
->>>>>>> eead24cf064976b648de5826eab51880c803b0fa
+_book
+*.epub
+*.pdf
+.DS_Store
diff --git a/.gitignore.orig b/.gitignore.orig
deleted file mode 100644
index b2eb862a..00000000
--- a/.gitignore.orig
+++ /dev/null
@@ -1,8 +0,0 @@
-*~
-pkg/*
-*.html
-*.exe
-<<<<<<< HEAD
-=======
-
->>>>>>> eead24cf064976b648de5826eab51880c803b0fa
diff --git a/README.md.orig b/README.md.orig
deleted file mode 100644
index af091edb..00000000
--- a/README.md.orig
+++ /dev/null
@@ -1,46 +0,0 @@
-# Multiple Language Versions
-<<<<<<< HEAD
-=======
-* [English](en/)
->>>>>>> eead24cf064976b648de5826eab51880c803b0fa
-* [French](fr/)
-* [Spanish](es/)
-* [中文](zh/)
-* [日本語](ja/)
-* [Turkish](tr/)
-* [Português - Brasil](pt-br/)
-* [German](de/)
-* [Русский](ru/)
-
-# Donate
-
-AliPay:
-
-English Donate:[donate](http://beego.me/donate)
-
-## Community
-QQ群:148647580
-
-BBS:[http://golanghome.com/](http://golanghome.com/)
-
-## Acknowledgments
-
- - [四月份平民](https://plus.google.com/110445767383269817959) (review代码)
- - [Hong Ruiqi](https://github.com/hongruiqi) (review代码)
- - [BianJiang](https://github.com/border) (编写go开发工具Vim和Emacs的设置)
- - [Oling Cat](https://github.com/OlingCat)(review代码)
- - [Wenlei Wu](mailto:spadesacn@gmail.com)(提供一些图片展示)
- - [polaris](https://github.com/polaris1119)(review书)
- - [雨痕](https://github.com/qyuhen)(review第二章)
-
-<<<<<<< HEAD
-=======
-Translator:
- - [LarryBattle](https://github.com/LarryBattle)
->>>>>>> eead24cf064976b648de5826eab51880c803b0fa
-## License
-Book License: [CC BY-SA 3.0 License](http://creativecommons.org/licenses/by-sa/3.0/)
-
-Code License: [BSD 3-Clause License]()
-
-
diff --git a/de/01.1.md b/de/01.1.md
index 4cd6fb45..f8ff2fbf 100644
--- a/de/01.1.md
+++ b/de/01.1.md
@@ -2,11 +2,11 @@
## Drei Wege Go zu installieren
-Es gibt viele Wege, um eine Go-Entwicklungsumgebung auf Deinem Computer einzurichten und Du kannst die auswählen, welche Dir gefällt. Die Folgenden sind die drei Häufigsten:
+Es gibt viele Wege, um eine Go-Entwicklungsumgebung auf Deinem Computer einzurichten und Du kannst die auswählen, welche Dir gefällt. Die Folgenden sind die drei Häufigsten:
- Offizielle Installationspakete.
- Das Team um Go stellt praktische Installationspakete für Windows, Linux, Mac und andere Betriebssysteme zur Verfügung. Dies ist wahrscheinlich der einfachste Weg, um zu starten.
-- Eingenhändige Kompilierung des Quellcodes.
+- Eigenhändige Kompilierung des Quellcodes.
- Beliebt untern Entwicklern, die mit UNIX-ähnlichen Systemen vertraut sind.
- Nutze Programme von Dritten.
- Da Draußen gibt es eine Menge Werkzeuge von Drittanbietern und Paketmanager, um Go zu installieren, wie apt-get in Ubuntu oder homebrew für Mac.
@@ -15,9 +15,9 @@ Es gibt viele Wege, um eine Go-Entwicklungsumgebung auf Deinem Computer einzuric
Im Fall, dass Du mehr als eine Version von Go auf Deinem Computer installieren möchtest, dann empfehle ich Dir, einen Blick auf [GVM](https://github.com/moovweb/gvm) zu werfen. Es ist die bisher beste Möglichkeit, die ich soweit gesehen habe, um dies zu tun. Andernfalls musst Du diese Aufgabe selbst bewältigen.
-## Eingenhändige Kompilierung des Quellcodes
+## Eigenhändige Kompilierung des Quellcodes
-Da einige Bestandteile von Go in Plan 9 C und AT&T Assembler geschrieben sind, musst Du einen C-Compiler installieren, bevor Du den nächsten Schritt durchführst.
+Da einige Bestandteile von Go in Plan 9 C und AT&T Assembler geschrieben sind, musst Du einen C-Compiler installieren, bevor Du den nächsten Schritt durchführst.
Auf dem Mac, sofern Du Xcode installiert hast, ist bereits ein entsprechender Compiler vorhanden.
diff --git a/de/02.2.md b/de/02.2.md
index 198f79b2..9a9d870c 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(
@@ -219,7 +219,7 @@ Gruppierter Ansatz.
prefix string
)
-Wird innerhalb von `constant()` einer Konstanten das Schlüsselwort `iota` als Wert zugewiesen, hat sie den Wert `0`. Werden den folgenden Konstanten keinee expliziten Werte zugewiesen, wird der letzte zugeweise Wert von `iota` um 1 erhöht und und der folgenden Konstante zugewiesen. Dieses Verhalten beleuchten wir im folgenden Absatz.
+Wird innerhalb von `constant()` einer Konstanten das Schlüsselwort `iota` als Wert zugewiesen, hat sie den Wert `0`. Werden den folgenden Konstanten keine expliziten Werte zugewiesen, wird der letzte zugeweise Wert von `iota` um 1 erhöht und der folgenden Konstante zugewiesen. Dieses Verhalten beleuchten wir im folgenden Absatz.
### Aufzählen mit iota
@@ -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/de/02.3.md b/de/02.3.md
index 564031a5..be0d87ae 100644
--- a/de/02.3.md
+++ b/de/02.3.md
@@ -333,7 +333,7 @@ Nun können wir den Wert von `x` in der Funktion ändern. Aber warum nutzen wir
### defer
-Go besitzt mit `defer` ein weiteres nützliches Schlüsselwort. Du kannst `defer` mehrmals in einer Funktion nutzen. Sie werden in umgekehrter Reihenfolge am Ende einer Funktion ausgeführt. Im dem Fall, dass Dein Programm eine Datei öffnet, muss diese erst wieder geschlossen werden, bevor Fehler zurückgeben werden können. Schauen wir uns ein paar Beispiele an.
+Go besitzt mit `defer` ein weiteres nützliches Schlüsselwort. Du kannst `defer` mehrmals in einer Funktion nutzen. Sie werden in umgekehrter Reihenfolge am Ende einer Funktion ausgeführt. Im Fall, dass Dein Programm eine Datei öffnet, muss diese erst wieder geschlossen werden, bevor Fehler zurückgeben werden können. Schauen wir uns ein paar Beispiele an.
func LesenSchreiben() bool {
file.Open("Datei")
@@ -520,4 +520,4 @@ Es gibt spezielle Operatoren beim Importieren von Paketen, die Anfänger oftmals
- [Inhaltsverzeichnis](preface.md)
- Vorheriger Abschnitt: [Grundlagen von Go](02.2.md)
-- Nächster Abschnitt: [Struct](02.4.md)
\ No newline at end of file
+- Nächster Abschnitt: [Struct](02.4.md)
diff --git a/de/02.4.md b/de/02.4.md
index 98d7dc3c..592d8a6c 100644
--- a/de/02.4.md
+++ b/de/02.4.md
@@ -179,7 +179,7 @@ In Go können alle Datenttypen eingebettet werden.
fmt.Println("Ihre bevorzugte Nummer lautet", jane.int)
}
-Im oberen Beispiel ist erkenntlich, dass alle Datentypen eingebettet werden und Funktion auf ihre Werte zugreifen können.
+Im oberen Beispiel ist erkenntlich, dass alle Datentypen eingebettet werden und Funktionen auf ihre Werte zugreifen können.
Aber es gibt noch ein kleines Problem. Was geschieht, wenn Mensch die Eigenschaft `telefon` besitzt und Student eine Eigenschaft mit dem gleichen Namen besitzt?
@@ -211,4 +211,4 @@ Go nutzt einen einfachen Weg zur Unterscheidung. Um die Eigenschaft `telefon` vo
- [Inhaltsverzeichnis](preface.md)
- Vorheriger Abschnitt: [Kontrollstrukturen und Funktionen](02.3.md)
-- Nächster Abschnitt: [Objektorientiertes Programmieren](02.5.md)
\ No newline at end of file
+- Nächster Abschnitt: [Objektorientiertes Programmieren](02.5.md)
diff --git a/de/02.5.md b/de/02.5.md
index 613d52ab..745bdc25 100644
--- a/de/02.5.md
+++ b/de/02.5.md
@@ -1,6 +1,6 @@
# 2.5 Objektorientierte Programmierung
-In den letzen beiden Abschnitten hatten wir uns mit Funktionen und Structs beschäftigt, aber hast Du jemals daran gedacht, Funktionen als Eigenschaft in einem Struct zu verwenden? In diesem Abschnitt werden ich Dir eine besondere Art von Funktionen vorstellen, die einen Reciever (engl. to recieve - empfangen) besitzen. Sie werden auch `Methoden` genannt.
+In den letzen beiden Abschnitten hatten wir uns mit Funktionen und Structs beschäftigt, aber hast Du jemals daran gedacht, Funktionen als Eigenschaft in einem Struct zu verwenden? In diesem Abschnitt werde ich Dir eine besondere Art von Funktionen vorstellen, die einen Reciever (engl. to recieve - empfangen) besitzen. Sie werden auch `Methoden` genannt.
## Methoden
@@ -306,4 +306,4 @@ Nun bist Du bereit, Dein eigenes, objektorientiers Programm zu schreiben. Auch M
- [Inhaltsverzeichnis](preface.md)
- Vorheriger Abschnitt: [Struct](02.4.md)
-- Nächster Abschnitt: [Interface](02.6.md)
\ No newline at end of file
+- Nächster Abschnitt: [Interface](02.6.md)
diff --git a/de/02.6.md b/de/02.6.md
index f36c2528..be3f18de 100644
--- a/de/02.6.md
+++ b/de/02.6.md
@@ -89,7 +89,7 @@ Zudem implementiert jeder Datentyp das leere Interface `interface{}`, da es kein
### Interface als Datentyp
-Welche Arten von Werten können mit einem Interface verknüpft werden? Wen wir eine Variable vom Typ Interface definieren, dann kann jeder Datentyp, der das Interface implementiert wird, der Variable zugewiesen werden.
+Welche Arten von Werten können mit einem Interface verknüpft werden? Wen wir eine Variable vom Typ Interface definieren, dann kann jeder Datentyp, der das Interface implementiert, der Variable zugewiesen werden.
Es ist wie im oberen Beispiel. Erstellen wir eine Variable "m" mit dem Interface Männer, kann jeder Student, Mensch oder Mitarbeiter "m" zugewiesen werden. So könnten wir ein Slice mit dem Interface Männer jeden Datentyp hinzufügen, der ebenfalls das Interface Männer implementiert. Bedenke aber, dass sich das Verhalten von Slices ändert, wenn dies Elemente eines Interface statt eines Datentypes verwendet.
diff --git a/de/02.8.md b/de/02.8.md
index 197e4d92..ad7784ba 100644
--- a/de/02.8.md
+++ b/de/02.8.md
@@ -23,10 +23,10 @@ In diesem Kapitel haben wir uns hauptsächlich mit den 25 Schlüsselwörtern in
- `map` definiert eine Map, welche Hashtabellen in anderen Programmiersprachen ähneln.
- `range` wird genutzt, um Daten aus einem `slice`, einer `map` oder einem`channel` zu erhalten.
-Wenn Du verstanden was, wie die 25 Schlüsselwörter einzusetzen sind, dann hast Du bereits eine Menge über Go gelernt.
+Wenn Du verstanden hast, wie die 25 Schlüsselwörter einzusetzen sind, dann hast Du bereits eine Menge über Go gelernt.
## Links
- [Inhaltsverzeichnis](preface.md)
- Vorheriger Abschnitt: [Nebenläufigkeit](02.7.md)
-- Nächstes Kapitel: [Grundlagen des Internets](03.0.md)
\ No newline at end of file
+- Nächstes Kapitel: [Grundlagen des Internets](03.0.md)
diff --git a/en/02.1.md b/en/02.1.md
index fb21f6ed..bc8b1775 100644
--- a/en/02.1.md
+++ b/en/02.1.md
@@ -17,7 +17,7 @@ While this might seem to be a shallow problem at the top, but when the codebase
For other languages there are many variables when it comes to writing code, every language is good for its use case, but Go is a little special in that turf because it was designed at a company which is the very synonym of the Internet (and distributed computing), typically the flow of writing code goes from Python to Java to C++ for optimization purposes, but the problem is that almost all languages which are widely in use right now were written decades ago when 1GB storage came at a much higher price compared to now, where storage and computing has gotten cheap. Computers are getting multiples cores these days and the "old languages" don't harness concurrency in a way that go does, not because those languages are bad, but simply because that usecase wasn't relevant when the languages evolved.
-So to mitigate all the problems that Google faced with the current tools, they wrote a systems language called Go, which you are about to learn! There are many many advantages to using golang, and there might be disadvantages too for every coin has both sides. But significant improvements in places like code formatting, since they designed the language in such a way that there won't be wars on how to format code, the gocode written by anyone in the world (assuming they know and use `gofmt`) will look exactly the same, this won't seem to matter until you work in a team! also when the company uses automated code review or some other fancy technique then in other languages which don't have strict and standard formatting rules then the code might get screwed up, but not in go!
+So to mitigate all the problems that Google faced with the current tools, they wrote a systems language called Go, which you are about to learn! There are many advantages to using golang, and there might be disadvantages too for every coin has both sides. But significant improvements in places like code formatting, since they designed the language in such a way that there won't be wars on how to format code, the gocode written by anyone in the world (assuming they know and use `gofmt`) will look exactly the same, this won't seem to matter until you work in a team! also when the company uses automated code review or some other fancy technique then in other languages which don't have strict and standard formatting rules then the code might get screwed up, but not in go!
Go was designed with concurrency in mind, please note that parallelism != concurrency, there is an amazing post by Rob Pike on the golang blog, blog.golang.org, you will find it there, it is worth a read.
diff --git a/en/06.4.md b/en/06.4.md
index 658f37c1..48740086 100644
--- a/en/06.4.md
+++ b/en/06.4.md
@@ -49,7 +49,7 @@ Refresh the page and you'll see the following:
Figure 6.7 hijacking the session has succeeded.
-Here we see that we can hijack sessions between different browsers, and actions performed in one one browser can affect the state of a page in another browser. Because HTTP is stateless, there is no way of knowing that the session id from firefox is simulated, and chrome is also not able to know that it's session id has been hijacked.
+Here we see that we can hijack sessions between different browsers, and actions performed in one browser can affect the state of a page in another browser. Because HTTP is stateless, there is no way of knowing that the session id from firefox is simulated, and chrome is also not able to know that it's session id has been hijacked.
## prevent session hijacking
diff --git a/en/07.4.md b/en/07.4.md
index c645d7a2..8543f254 100644
--- a/en/07.4.md
+++ b/en/07.4.md
@@ -9,11 +9,11 @@ The following demonstrates the template mechanism:
Figure 7.1 Template mechanism
-Most of the content that web applications respond to clients with is static, and the dynamic parts are usually very small. For example, if you need to display a list users who have visited a page, only the user name would be dynamic. The style of the list remains the same. As you can see, templates are useful for reusing static content.
+Most of the content that web applications respond to clients with is static, and the dynamic parts are usually very small. For example, if you need to display a list users who have visited a page, only the user name would be dynamic. The style of the list remains the same. As you can see, templates are useful for reusing static content.
## Templating in Go
-In Go, we have the `template` package to help handle templates. We can use functions like `Parse`, `ParseFile` and `Execute` to load templates from plain text or files, then evaluate the dynamic parts, as shown in figure 7.1.
+In Go, we have the `template` package to help handle templates. We can use functions like `Parse`, `ParseFile` and `Execute` to load templates from plain text or files, then evaluate the dynamic parts, as shown in figure 7.1.
Example:
@@ -75,8 +75,8 @@ If you print `{{.}}` in a template, Go outputs a formatted string of this object
We know how to output a field now. What if the field is an object, and it also has its own fields? How do we print them all in one loop? We can use `{{with …}}…{{end}}` and `{{range …}}{{end}}` for exactly that purpose.
-- `{{range}}` just like range in Go.
-- `{{with}}` lets you write the same object name once and use `.` as shorthand for it ( ***Similar to `with` in VB*** ).
+- {% raw %}`{{range}}`{% endraw %} just like range in Go.
+- {% raw %}`{{with}}`{% endraw %} lets you write the same object name once and use `.` as shorthand for it ( ***Similar to `with` in VB*** ).
More examples:
@@ -305,6 +305,7 @@ Here's a complete example, supposing that we have the following three files: `he
Main template:
+{% raw %}
//header.tmpl
{{define "header"}}
@@ -330,10 +331,11 @@ Main template: