Fix typos and punctuation errors
This commit is contained in:
@@ -78,7 +78,7 @@
|
||||
|
||||
### Linux
|
||||
|
||||
Зайдите на [страницу загрузки](https://golang.org/dl/), выберите `go1.4.2.linux-386.tar.gz` для 32-битных систем или `go1.4.2.linux-amd64.tar.gz` для 64-битных. Предположим, Вы хотите установить Go в каталог `$GO_INSTALL_DIR`. Распакуйте `tar.gz` в этот каталог командой `tar zxvf go1.4.2.linux-amd64.tar.gz -C $GO_INSTALL_DIR`. Затем измените прееменную $PATH следующим образом: `export PATH=$PATH:$GO_INSTALL_DIR/go/bin`. Теперь откройте терминал и напечатайте `go`. Вы должны увидеть то же, что показано на рисунке 1.1.
|
||||
Зайдите на [страницу загрузки](https://golang.org/dl/), выберите `go1.4.2.linux-386.tar.gz` для 32-битных систем или `go1.4.2.linux-amd64.tar.gz` для 64-битных. Предположим, Вы хотите установить Go в каталог `$GO_INSTALL_DIR`. Распакуйте `tar.gz` в этот каталог командой `tar zxvf go1.4.2.linux-amd64.tar.gz -C $GO_INSTALL_DIR`. Затем измените переменную $PATH следующим образом: `export PATH=$PATH:$GO_INSTALL_DIR/go/bin`. Теперь откройте терминал и напечатайте `go`. Вы должны увидеть то же, что показано на рисунке 1.1.
|
||||
|
||||
### Windows
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
- Если в каталоге много файлов, но Вы хотите скомпилировать только один, Вам нужно добавить имя файла после `go build`. Например, `go build a.go`. Просто `go build` скомпилирует все файлы в каталоге.
|
||||
- Вы также можете указать имя исполняемого файла, который будет создан. Например, в проекте `mathapp` (раздел 1.2), команда `go build -o astaxie.exe` создаст `astaxie.exe` вместо `mathapp.exe`. Именем по умолчанию для исполняемого файла является имя каталога (если пакет не main) или название первого файла-исходника (если пакет - main).
|
||||
|
||||
(Согласно [The Go Programming Language Specification](https://golang.org/ref/spec) имя пакета должно следовать после слова `package` в первой строке исходного файла. Оно не обязательно должно быть таким же, как имя каталога, и имя исполняемого файла по умлочанию будет таким же, как и имя каталога.)
|
||||
(Согласно [Спецификации Языка Программирования Go](https://golang.org/ref/spec) имя пакета должно следовать после слова `package` в первой строке исходного файла. Оно не обязательно должно быть таким же, как имя каталога, и имя исполняемого файла по умолчанию будет таким же, как и имя каталога.)
|
||||
|
||||
- `go build` не работает с файлами, имя которых начинается на `_` или `.`.
|
||||
- Если Вам нужно несколько исходных файлов для каждой операционной системы, Вы можете в конце каждого имени файла добавить соответствующий суффикс ОС. Предположим, имеется несколько файлов для загрузки массивов. Можно назвать их следующим образом:
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
## go get
|
||||
|
||||
Эта команда служит для установки удаленных пакетов. На данный момент она поддерживает BitBucket, GitHub, Google Code и Launchpad. При запуске этой команды происходят вещи: первая - Go скачивает исходники пакетов, вторая - исполняется `go install`. Перед использованием этой команды убедитесь, что у Вас установлены соответствующие инструменты:
|
||||
Эта команда служит для установки удаленных пакетов. На данный момент она поддерживает BitBucket, GitHub, Google Code и Launchpad. При запуске этой команды происходят следующие вещи: первая - Go скачивает исходники пакетов, вторая - исполняется `go install`. Перед использованием этой команды убедитесь, что у Вас установлены соответствующие инструменты:
|
||||
|
||||
BitBucket (Mercurial Git)
|
||||
GitHub (git)
|
||||
@@ -81,11 +81,11 @@
|
||||
|
||||
## godoc
|
||||
|
||||
Многие говорят, что никакая сторонняя документация для программирования на Go не нужна (вообще я одну сделал - [CHM](https://github.com/astaxie/godoc)). В Go существует мощная утилита для того, чтобы управлять документацией "из коробки".
|
||||
Многие говорят, что никакая сторонняя документация для программирования на Go не нужна (вообще, я одну сделал - [CHM](https://github.com/astaxie/godoc)). В Go существует мощная утилита для того, чтобы управлять документацией "из коробки".
|
||||
|
||||
Итак, как мы можем ознакомиться с информацией о пакете в документации? Например, если Вы хотите получить подробную информацию о пакете `builtin`, используйте команду `godoc builtin`. Подобным образом Вы можете воспользоваться `godoc net/http` для того, чтобы ознакомиться с документацией по пакету `http`. Если Вам нужно больше деталей об отдельных функциях, выполните `godoc fmt Printf` и `godoc -src fmt Printf`, чтобы увидеть исходный код функции .
|
||||
|
||||
Выполните `godoc -http=:8080`, затем откройте в браузере `127.0.0.1:8080`. Вы должны увидеть локальную версию сайта golang.org. Он покажет не только информацию о стандартных пакетах, но также о пакетах в Вашем `$GOPATH/pkg`. Это здорово для людей, которые страдают от Великого Китайского Файерволла.
|
||||
Выполните `godoc -http=:8080`, затем откройте в браузере `127.0.0.1:8080`. Вы должны увидеть локальную версию сайта golang.org. Она покажет не только информацию о стандартных пакетах, но также о пакетах в Вашем `$GOPATH/pkg`. Это здорово для людей, которые страдают от Великого Китайского Файерволла.
|
||||
|
||||
## Другие утилиты
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# 1.4 Инструменты разработки для Go
|
||||
|
||||
В этом разделе я ознакомлю Вас с несколькими средами разработки (IDE), которые помогут Вам более эффективно программировать. Они обладают такими возможностями как умное автодополнение и автоформатирование. Все они кроссплатформенные, поэтому шаги по настройке, которые я покажу, не будут слишком отличаться в зависимости от операционной системы, которую Вы используете.
|
||||
В этом разделе я ознакомлю Вас с несколькими средами разработки (IDE), которые помогут Вам более эффективно программировать. Они обладают такими возможностями, как умное автодополнение и автоформатирование. Все они кроссплатформенные, поэтому шаги по настройке, которые я покажу, не будут слишком отличаться в зависимости от операционной системы, которую Вы используете.
|
||||
|
||||
## LiteIDE
|
||||
|
||||
LiteIDE - нетребовательный к ресурсам системы IDE с открытым исходным кодом, который предназначен для разработки проектов только на Go. Он разработан visualfc.
|
||||
LiteIDE - нетребовательная к ресурсам системы IDE с открытым исходным кодом, которая предназначена для разработки проектов только на Go. Она разработана visualfc.
|
||||
|
||||

|
||||
|
||||
@@ -20,7 +20,7 @@ LiteIDE - нетребовательный к ресурсам системы ID
|
||||
- Поддерживает разные среды компиляции
|
||||
- Поддерживает кросс-компиляцию проектов на Go
|
||||
- Управление проектами
|
||||
- Представление досументации основано на $GOPATH
|
||||
- Представление документации основано на $GOPATH
|
||||
- Система компиляции основана на $GOPATH
|
||||
- Документация API основана на $GOPATH
|
||||
- Редактор исходного кода Go
|
||||
@@ -48,7 +48,7 @@ LiteIDE - нетребовательный к ресурсам системы ID
|
||||
|
||||
- Установите LiteIDE:
|
||||
- [Страница загрузки](http://code.google.com/p/golangide)
|
||||
- [Исходные коды](https://github.com/visualfc/liteide)
|
||||
- [Исходный код](https://github.com/visualfc/liteide)
|
||||
|
||||
Сначала установите Go, затем скачайте версию LiteIDE, соответствующую Вашей операционной системе. Распакуйте скачанный пакет.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 2 Введение в Go
|
||||
# 2. Введение в Go
|
||||
|
||||
Go - компилируемый системный язык программирования, и он относится к С-подобным языкам. Однако, скорость его компиляции намного выше. Он имеет всего 25 ключевых слов... даже меньше чем букв в английском алфавите! Давайте взглянем на эти ключевые слова прежде чем мы начнем.
|
||||
Go - компилируемый системный язык программирования, и он относится к С-подобным языкам. Однако, скорость его компиляции намного выше. Он имеет всего 25 ключевых слов... даже меньше, чем букв в английском алфавите! Давайте взглянем на эти ключевые слова прежде, чем мы начнем.
|
||||
|
||||
break default func interface select
|
||||
case defer go map struct
|
||||
@@ -8,7 +8,7 @@ Go - компилируемый системный язык программир
|
||||
const fallthrough if range type
|
||||
continue for import return var
|
||||
|
||||
В этой главе, я собираюсь научить вас основам Go. Вы обнаружите, насколько лаконичен язык Go, и как превосходна его архитектура. Программирование на Go может быть по-настоящему веселым. После того, как вы закончите эту главу, вы будете знакомы с упомянутыми ключевыми словами.
|
||||
В этой главе я собираюсь научить вас основам Go. Вы увидите, насколько лаконичен язык Go, и как превосходна его архитектура. Программирование на Go может быть по-настоящему веселым. После того, как вы закончите эту главу, вы будете знакомы с упомянутыми ключевыми словами.
|
||||
|
||||
## Ссылки
|
||||
|
||||
|
||||
10
ru/02.1.md
10
ru/02.1.md
@@ -1,6 +1,6 @@
|
||||
# 2.1 Привет, Go
|
||||
|
||||
Прежде чем мы начнем конструировать приложение на Go, нам необходимо научиться писать простые программы. Вы не сможете построить здание, не узнав, сперва, как проложить фундамент. Вследствие чего, в этом разделе мы изучим базовый синтакс для запуска простой программы.
|
||||
Прежде, чем мы начнем конструировать приложение на Go, нам необходимо научиться писать простые программы. Вы не сможете построить здание, не узнав, сперва, как проложить фундамент. Вследствие чего, в этом разделе мы изучим базовый синтакс для запуска простой программы.
|
||||
|
||||
## Программа
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
## Объяснение
|
||||
|
||||
Во-первых программы в Go состоят из `package` (пакетов).
|
||||
Во-первых, программы в Go состоят из `package` (пакетов).
|
||||
|
||||
`package <pkgName>` (В данном случае `package main`) говорит нам о том, что этот исходный файл принадлежит к `main` пакету. А ключевое слово `main`, что данный пакет должен компилироваться в программу, а не в пакет файлов с расширением `.a`.
|
||||
|
||||
@@ -31,11 +31,11 @@
|
||||
Чтобы вывести `Hello, world…`, мы вызвали функцию `Printf`. Эта функция находится в пакете `fmt`, поэтому нам надо импортировать этот пакет, что мы и делаем в третьей строчке кода - `import "fmt"`.
|
||||
|
||||
Пакеты в Go похожи на аналогичные в Python, вот несколько преимуществ пакетов:
|
||||
Модульность (разбить программу на несколько модулей) и повторное использование (каждый модуль может быть использован во множестве программ). Сейчас мы просто рассмотрели общее представление пакетов, и чуть позже напишем свой собственный пакет.
|
||||
Модульность (разбиение программы на несколько модулей) и повторное использование (каждый модуль может быть использован во множестве программ). Сейчас мы просто рассмотрели общее представление пакетов, и чуть позже напишем свой собственный пакет.
|
||||
|
||||
В пятой строке мы использовали ключевое слово `func` для определения функции `main`. Тело функции находится внутри `{}`, прямо как в C, C++ и Java.
|
||||
|
||||
Как вы видите она не принимает ни один аргумент. Мы научимся писать функции, принимающие аргументы всего через минуту, а также функции которые не возвращают значение или возращают несколько.
|
||||
Как вы видите, она не принимает ни один аргумент. Мы научимся писать функции, принимающие аргументы всего через минуту, а также функции которые не возвращают значение или возращают несколько.
|
||||
|
||||
В шестой строке мы вызываем функцию `Printf`, которая находится в пакете `fmt`. Она была вызвана, используя синтаксис `<pkgName>.<funcName>` (`<имя пакета>.<имя функции>`), в Python-стиле.
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
## Заключение
|
||||
|
||||
Go использует `package` (пакет) для структурирования программ. Функция `main.main()` (эта функция находится в пакете `main`) входной пункт каждой программы. Go поддерживает стандарт UTF-8, так как один из создателей Go является также одним из создателей UTF-8, так что Go поддерживает множество языков с самого рождения.
|
||||
Go использует `package` (пакет) для структурирования программ. Функция `main.main()` (эта функция находится в пакете `main`) - входной пункт каждой программы. Go поддерживает стандарт UTF-8, так как один из создателей Go является также одним из создателей UTF-8, так что Go поддерживает множество языков с самого рождения.
|
||||
|
||||
## Ссылки
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
_, b := 34, 35
|
||||
|
||||
Если Вы определили переменную и не использовали ее нигде в своей программе, компилятор покажет Вам ошибку компиляции. Попробуйте откомпилировать следующий код и посмотрите, что будет:
|
||||
Если Вы определили переменную и не использовали ее нигде в своей программе, компилятор покажет Вам ошибку компиляции. Попробуйте скомпилировать следующий код и посмотрите, что будет:
|
||||
|
||||
package main
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
|
||||
Хотя int32 длиннее int8 и является тем же типом, что и int, нельзя использовать их в одним выражении. ( ***'c' здесь будет определена как переменная типа `int`*** )
|
||||
|
||||
К типам с плавающей точкой относятся `float32` и `float64`; типа, называемого `float` в Go нет. `float64` используется по умолчанию при коротком объявлении.
|
||||
К типам с плавающей точкой относятся `float32` и `float64`; типа, называемого `float`, в Go нет. `float64` используется по умолчанию при коротком объявлении.
|
||||
|
||||
Это все? Нет! Go также поддерживает и комплексные числа. `complex128` (с 64-битной вещественной и 64-битной мнимыми частями) является комплексным числом по умолчанию, а если Вам нужны числа поменьше, есть `complex64` (с 32-битной вещественной и 32-битной нмимыми частями). Числа представлены в форме `RE+IMi`, где `RE` - вещественная часть, а `IM` - мнимая, последнее `i` - мнимая единица. Вот пример комплексного числа:
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
|
||||
### Строки
|
||||
|
||||
Мы уже говорили о том, как Go использует кодировку UTF-8. Строки представлены двойными кавычками `""` или обратными кавычками ``` `` ```.
|
||||
Мы уже говорили о том, что Go использует кодировку UTF-8. Строки представлены двойными кавычками `""` или обратными кавычками ``` `` ```.
|
||||
|
||||
// Пример кода
|
||||
var frenchHello string // основная форма определения строки
|
||||
@@ -398,7 +398,7 @@
|
||||
|
||||
// Задаем карте начальное значение
|
||||
rating := map[string]float32 {"C":5, "Go":4.5, "Python":4.5, "C++":2 }
|
||||
// карта возвращает два значения. В качестве второго, если элемента с таким ключом не существует, 'ok' возвращает 'false', иначе - 'true'.
|
||||
// карта возвращает два значения. В качестве второго, если элемента с таким ключом не существует, 'ok' принимает значение 'false', иначе - 'true'.
|
||||
csharpRating, ok := rating["C#"]
|
||||
if ok {
|
||||
fmt.Println("C# находится в карте, его рейтинг - ", csharpRating)
|
||||
|
||||
@@ -9,7 +9,7 @@ type person struct {
|
||||
age int
|
||||
}
|
||||
```
|
||||
Вот так как легко определять `структуру`!
|
||||
Вот так легко определять `структуру`!
|
||||
|
||||
У нас есть два поля:
|
||||
|
||||
|
||||
@@ -367,7 +367,7 @@ type ReadWriter interface {
|
||||
t := reflect.TypeOf(i) // получает мета-данные типа i в переменную t
|
||||
v := reflect.ValueOf(i) // получает значение типа i в переменную v
|
||||
```
|
||||
После этого мы может конвертировать типы, полученные в результате рефлексии, для того, чтобы получить нужные нам значения.
|
||||
После этого мы можем конвертировать типы, полученные в результате рефлексии, для того, чтобы получить нужные нам значения.
|
||||
```Go
|
||||
var x float64 = 3.4
|
||||
v := reflect.ValueOf(x)
|
||||
|
||||
@@ -91,7 +91,7 @@ runtime.Gosched() говорит процессору, что нужно исп
|
||||
|
||||
## Буферизованные каналы
|
||||
|
||||
Выше я говорил о небуферизованных каналах. В Go также есть буферизованные каналы, которые могут хранить больше, чем один элемент. Нарпимер, `ch := make(chan bool, 4)`, здесь мы создали канал, который может содержать 4 булевых элемента. Поэтому в этот канал мы можем послать до 4 булевых элементов, и горутина не заблокриуется, но она заблокируется, когда Вы попытаетесь послать в канал пятый элемент, и ни одна горутина его не примет.
|
||||
Выше я говорил о небуферизованных каналах. В Go также есть буферизованные каналы, которые могут хранить больше, чем один элемент. Нарпимер, `ch := make(chan bool, 4)`, здесь мы создали канал, который может содержать 4 булевых элемента. Поэтому в этот канал мы можем послать до 4 булевых элементов, и горутина не заблокируется, но она заблокируется, когда Вы попытаетесь послать в канал пятый элемент, и ни одна горутина его не примет.
|
||||
|
||||
ch := make(chan type, n)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 3 Основы Веба
|
||||
# 3. Основы Веба
|
||||
|
||||
Основной причиной, по которой вы читаете эту книгу, является желание научиться создавать веб-приложения на языке Go. Как я уже говорил ранее, Go предоставляет много мощных пакетов, способных справляться с этой задачей, например пакет «http». Этот пакет поможет вам создавать web-приложения. Я объясню Вам все что вы должны знать о разработке веб-приложений в следующих главах, а сейчас мы поговорим о концепции Веба и о том как запускать веб-приложения в Go.
|
||||
Основной причиной, по которой вы читаете эту книгу, является желание научиться создавать веб-приложения на языке Go. Как я уже говорил ранее, Go предоставляет много мощных пакетов, способных справляться с этой задачей, например пакет «http». Этот пакет поможет вам создавать web-приложения. Я объясню Вам все, что вы должны знать о разработке веб-приложений, в следующих главах, а сейчас мы поговорим о концепции Веба и о том, как запускать веб-приложения в Go.
|
||||
|
||||
## Ссылки
|
||||
|
||||
|
||||
10
ru/03.1.md
10
ru/03.1.md
@@ -1,4 +1,4 @@
|
||||
# Принципы работы веб
|
||||
# 3.1 Принципы работы веб
|
||||
|
||||
Каждый раз, когда Вы открываете браузер, вводите URL-адрес и нажимаете клавишу enter, вы видите красивые веб-страницы на вашем экране. Но знаете ли вы, что стоит за этим простым действием?
|
||||
|
||||
@@ -35,7 +35,7 @@ URL расшифровывается как Uniform Resource Locator, в пер
|
||||
<параметры> данные, которые будут отправлены на сервер
|
||||
<якорь> якорь
|
||||
|
||||
DNS-это аббревиатура Domain Name System - система доменных имен. Это система имен для компьютерных сетевых служб , которая преобразует доменное имя в фактические IP-адреса (своеобразный переводчик).
|
||||
DNS - это аббревиатура Domain Name System - система доменных имен. Это система имен для компьютерных сетевых служб, которая преобразует доменное имя в фактические IP-адреса (своеобразный переводчик).
|
||||
|
||||

|
||||
|
||||
@@ -70,7 +70,7 @@ HTTP является протоколом независимой обработ
|
||||
|
||||
### HTTP запрос (информация о браузере)
|
||||
|
||||
Все пакеты запросов состоят из трех частей: строка запроса, заголовок запроса и тело запроса. Между заголовкам запроса и телом запроса идет одна пустая строка.
|
||||
Все пакеты запросов состоят из трех частей: строка запроса, заголовок запроса и тело запроса. Между заголовком запроса и телом запроса идет одна пустая строка.
|
||||
|
||||
GET /domains/example/ HTTP/1.1 // request line: request method, URL, protocol and its version
|
||||
Host:www.iana.org // имя домена
|
||||
@@ -106,7 +106,7 @@ POST помещает данные в теле запроса, поскольк
|
||||
Content-Type: text/html // тип данных ответа
|
||||
Transfer-Encoding: chunked // это означает, что данные были отправлены фрагментами
|
||||
Connection: keep-alive // сохранить подключение
|
||||
Content-Length: 90 // длинна тела (размер)
|
||||
Content-Length: 90 // длина тела (размер)
|
||||
// пустая строка
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"... // тело сообщения
|
||||
|
||||
@@ -114,7 +114,7 @@ POST помещает данные в теле запроса, поскольк
|
||||
|
||||
Клиент узнаёт по коду состояния о результатах его запроса и определяет, какие действия ему предпринимать дальше. В HTTP/1.1 определено 5 видов кодов состояний:
|
||||
|
||||
- 1XX информационные коды
|
||||
- 1xx информационные коды
|
||||
- 2xx коды успешного завершения
|
||||
- 3xx коды перенаправления
|
||||
- 4xx ошибка клиента
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
Если вы работаете с Ruby, вы наверняка заметили, что это как сценарий/сервер в RoR.
|
||||
|
||||
В данном разделе мы использовали две простые функции для создания простого веб-сервера который уже готов к параллельным вычислениям. В следующих двух разделах мы будем говорить о том, как использовать эту особенность.
|
||||
В данном разделе мы использовали две простые функции для создания простого веб-сервера, который уже готов к параллельным вычислениям. В следующих двух разделах мы будем говорить о том, как использовать эту особенность.
|
||||
|
||||
## Ссылки
|
||||
|
||||
|
||||
10
ru/03.3.md
10
ru/03.3.md
@@ -12,9 +12,9 @@ Conn: соединения между клиентами и серверами.
|
||||
|
||||
Handler: логика обработки запроса и генерация ответа.
|
||||
|
||||
## механизм работы пакета http
|
||||
## Механизм работы пакета http
|
||||
|
||||
На следующей картинке показано как работает веб-сервер Go.
|
||||
На следующей картинке показано, как работает веб-сервер Go.
|
||||
|
||||

|
||||
|
||||
@@ -34,7 +34,7 @@ Handler: логика обработки запроса и генерация о
|
||||
|
||||
Давайте посмотрим на исходный код пакета `http`.
|
||||
|
||||
//используется код Go версии 1.1.2
|
||||
//Используется код Go версии 1.1.2
|
||||
|
||||
func (srv *Server) Serve(l net.Listener) error {
|
||||
defer l.Close()
|
||||
@@ -68,7 +68,7 @@ Handler: логика обработки запроса и генерация о
|
||||
|
||||
Как происходит прием клиентских запросов? В исходном коде мы видим, что происходит вызов метода `srv.Serve(net.Listener)` для управления клиентскими запросами. В теле функции бесконечный цикл `for{}` принимает запросы, создает новое соединение, запускает новую горутину `go c.serve()` и передает в нее данные запроса. Так Go поддерживает высокий параллелизм, за счет того, что все горутины являются независимыми.
|
||||
|
||||
Теперь ответим на вопрос как используются конкретные функции для управления запросами? Сначала метод `conn` парсит запрос возвращаемый `c.ReadRequest()`, а затем получает соответствующий обработчик: `handler := c.server.Handler`, который, в совою очередь, передается в качестве второго аргумента при вызове метода `ListenAndServe`. В нашем сервере мы использовали `nil`, поэтому Go использует обработчик по умолчанию: `handler = DefaultServeMux`. Возникает вопрос - что здесь делает `DefaultServeMux`? DefaultServeMux - это переменная, содержащая указатель на текущий маршрутизатор, который вызывает обработчики для заданных URL-адресов. Разве мы его устанавливали? Ответ - да. Помните в первой строке нашего веб-сервера мы использовали `http.HandleFunc("/", sayhelloName)`. Эта функция регистрирует правила маршрутизации для пути "/". Когда URL-адрес запроса соответствует «/», маршрутизатор вызывает функцию «sayhelloName». DefaultServeMux вызывает ServerHTTP для получения функции обработчика соответствующего заданному пути. В нашем случае он вызывает «sayhelloName». Наконец, сервер отвечает клиенту.
|
||||
Теперь ответим на вопрос: как используются конкретные функции для управления запросами? Сначала метод `conn` парсит запрос, возвращаемый `c.ReadRequest()`, а затем получает соответствующий обработчик: `handler := c.server.Handler`, который, в свою очередь, передается в качестве второго аргумента при вызове метода `ListenAndServe`. В нашем сервере мы использовали `nil`, поэтому Go использует обработчик по умолчанию: `handler = DefaultServeMux`. Возникает вопрос - что здесь делает `DefaultServeMux`? DefaultServeMux - это переменная, содержащая указатель на текущий маршрутизатор, который вызывает обработчики для заданных URL-адресов. Разве мы его устанавливали? Ответ - да. Помните в первой строке нашего веб-сервера мы использовали `http.HandleFunc("/", sayhelloName)`. Эта функция регистрирует правила маршрутизации для пути "/". Когда URL-адрес запроса соответствует «/», маршрутизатор вызывает функцию «sayhelloName». DefaultServeMux вызывает ServerHTTP для получения функции обработчика соответствующего заданному пути. В нашем случае он вызывает «sayhelloName». Наконец, сервер отвечает клиенту.
|
||||
|
||||
Подробное описание процесса:
|
||||
|
||||
@@ -82,6 +82,6 @@ Handler: логика обработки запроса и генерация о
|
||||
|
||||
- [Содержание](preface.md)
|
||||
- Предыдущий раздел: [Создание простого веб-сервера](03.2.md)
|
||||
- Следующий раздел: [Внутренний мир пакет http](03.4.md)
|
||||
- Следующий раздел: [Внутренний мир пакета http](03.4.md)
|
||||
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ Go использует следующий код для ожидания нов
|
||||
Структура muxEntry:
|
||||
|
||||
type muxEntry struct {
|
||||
explicit bool // exact match or not
|
||||
explicit bool // точное совпадение или нет
|
||||
h Handler
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ Go использует следующий код для ожидания нов
|
||||
|
||||
Маршрутизатор вызывает `mux.handler.ServeHTTP(w, r)` при получении запросов. Другими словами, он вызывает `ServeHTTP` интерфейсы обработчиков.
|
||||
|
||||
Давайте посмотрим как работает `mux.handler`.
|
||||
Давайте посмотрим, как работает `mux.handler`.
|
||||
|
||||
func (mux *ServeMux) handler(r *Request) Handler {
|
||||
mux.mu.RLock()
|
||||
@@ -70,7 +70,7 @@ Go использует следующий код для ожидания нов
|
||||
return h
|
||||
}
|
||||
|
||||
Маршрутизатор использует URL-адрес в качестве ключа для поиска соответствующего обработчика, который сохранен в карте и вызовов handler.ServeHTTP для выполнения функций обработки данных.
|
||||
Маршрутизатор использует URL-адрес в качестве ключа для поиска соответствующего обработчика, который сохранен в карте, и вызывает handler.ServeHTTP для обработки данных.
|
||||
|
||||
Теперь вы должны понимать принципы работы роутера. Фактически, Go поддерживает настраиваемые роутеры. Второй аргумент функции `ListenAndServe` необходим для конфигурации настраиваемого роутера с типом `Handler`. Таким образом, любой роутер реализует интерфейс `Handler`.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 3.5 Итоги главы
|
||||
|
||||
В этой главе мы познакомились с тем как работает HTTP, разрешение имен DNS и как создать простой веб-сервер на языке Go. После этого мы обсудили как Go создает веб-сервер на примере исходных кодов пакета `net/http`.
|
||||
В этой главе мы познакомились с тем, как работает HTTP, разрешение имен DNS и как создать простой веб-сервер на языке Go. После этого мы обсудили, как Go создает веб-сервер на примере исходных кодов пакета `net/http`.
|
||||
|
||||
Я надеюсь, вы узнали гораздо больше о веб-разработке и поняли, что создавать веб-приложения в Go достаточно легко.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 4 Пользовательские формы
|
||||
# 4. Пользовательские формы
|
||||
|
||||
Пользовательские формы очень часто используются при разработке веб-приложений. Они дают возможность клиенту и серверу устанавливать коммуникацию друг с другом. Если вы - веб-разработчик, Вы должны быть хорошо знакомы с веб-формами; если Вы - программист на C/C++, Вы можете спросить - что такое пользовательская форма?
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
Говорится, что HTTP - это протокол без сохранения состояния. Так как проверить, что данные из формы пришли от того же пользователя? И как можно быть уверенным, что одна форма может послать данные за один раз лишь единожды? Мы рассмотрим некоторые детали, касающиеся кук (куки - это информация, сохраняемая на стороне клиента и добавляемая в заголовок запроса, посылаемый на сервер) в разделах 4.3 и 4.4.
|
||||
|
||||
Еще один важный случай использования форм - загрузка файлов. В разделе 4.5 Вы научитесь, как это делать, осуществляя контроль размера файла перед тем, как его загрузить, средствами Go.
|
||||
Еще один важный случай использования форм - загрузка файлов. В разделе 4.5 Вы научитесь это делать, осуществляя контроль размера файла перед тем, как его загрузить, средствами Go.
|
||||
|
||||
## Ссылки
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Эта форма отправит данные по адресу `/login` на сервер. После того, как пользователь нажем кнопку "Войти", данные будут посланы на хэндлер `login`, зарегистрированный маршрутизатором сервера. Нам нужно знать, какой метод используется при этом - POST или GET?
|
||||
Эта форма отправит данные по адресу `/login` на сервер. После того, как пользователь нажмет кнопку "Войти", данные будут посланы на хэндлер `login`, зарегистрированный маршрутизатором сервера. Нам нужно знать, какой метод используется при этом - POST или GET?
|
||||
|
||||
Это легко узнать при помощи пакета `http`. Давайте посмотрим, как обработать данные формы со страницы входа:
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 4.3 Межсайтовый скриптинг
|
||||
|
||||
Для совершенствования взаимодействия с пользователем современные сайты содержат все больше динамического контента, что означает, что мы должны предоставлять информацию динамически в зависимости от поведения каждого пользователя. К сожалению, существует такое явление как "межсайтовый скриптинг" (известный как "XSS"), с помощью которого осуществляются постоянные атаки на динамические сайты, в то время как сайты со статическим содержимым этим атакам не подвержены.
|
||||
Для совершенствования взаимодействия с пользователем современные сайты содержат все больше динамического контента, что означает, что мы должны предоставлять информацию динамически, в зависимости от поведения каждого пользователя. К сожалению, существует такое явление как "межсайтовый скриптинг" (известный как "XSS"), с помощью которого осуществляются постоянные атаки на динамические сайты, в то время как сайты со статическим содержимым этим атакам не подвержены.
|
||||
|
||||
Злоумышленники посылают на сайты, подверженные межсайтовому скриптингу, скрипты на JavaScript, VBScript, ActiveX или Flash. Если скрипт удачно вторгся на сайт, пользовательская информация может быть похищена, а сайт наполнен спамом. Злоумышленники могут также изменить настройки пользователя на те, которые захотят.
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# 4.5 Загрузка файлов
|
||||
|
||||
Предположим, у Вас есть веб-сайт наподобие Instagram, и Вы хотите, чтобы пользователи закачивали туда свои фортографии. Как можно реализовать эту функцию?
|
||||
Предположим, у Вас есть веб-сайт наподобие Instagram, и Вы хотите, чтобы пользователи закачивали туда свои фотографии. Как можно реализовать эту функцию?
|
||||
|
||||
Для этого нужно добавить в форму, через которую будут закачиваться фотографии, свойство `enctype`. Оно имеет три значения:
|
||||
Для этого нужно добавить в форму, через которую будут закачиваться фотографии, со свойством `enctype`. Оно имеет три значения:
|
||||
|
||||
```
|
||||
application/x-www-form-urlencoded Кодировать все символы перед закачкой (по умолчанию).
|
||||
|
||||
@@ -8,4 +8,4 @@
|
||||
|
||||
- [Содержание](preface.md)
|
||||
- Предыдущий раздел: [Загрузка файлов](04.5.md)
|
||||
- Следужщий раздел: [Базы данных](05.0.md)
|
||||
- Следующий раздел: [Базы данных](05.0.md)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# 5 Базы данных
|
||||
# 5. Базы данных
|
||||
|
||||
Одним из ключевых аспектов веб разработки является использование баз данных. В базах данных можно хранить и обрабатывать почти все, например информацию о пользователях, продуктах, новостные списки и т.д.
|
||||
|
||||
Язык Go не имеет каких либо драйверов для баз данных, но у него есть драйвер интерфейса, определенный в пакете `database/sql`. На базе этого интерфейса разработчики могут легко создавать свои драйвера баз данных. В разделе 5.1 мы с вами рассмотрим структуру драйвера интерфеса в Go; в разделах 5.2 - 5.4 я покажу вам некоторые драйвера SQL баз данных; в разделе 5.5 я покажу ORM, которую я разработал базируясь на стандарте интерфейса `database/sql`, она совместима с большинством драйверов, включенных в интерфейс `database/sql` и предоставляет простой доступ к базам данных встиле языка Go. (***ORM (англ. Object-Relational Mapping, рус. объектно-реляционное отображение) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных».***)
|
||||
Язык Go не имеет каких либо драйверов для баз данных, но у него есть драйвер интерфейса, определенный в пакете `database/sql`. На базе этого интерфейса разработчики могут легко создавать свои драйвера баз данных. В разделе 5.1 мы с вами рассмотрим структуру драйвера интерфеса в Go; в разделах 5.2 - 5.4 я покажу вам некоторые драйвера SQL баз данных; в разделе 5.5 я покажу ORM, которую я разработал базируясь на стандарте интерфейса `database/sql`, она совместима с большинством драйверов, включенных в интерфейс `database/sql` и предоставляет простой доступ к базам данных в стиле языка Go. (***ORM (англ. Object-Relational Mapping, рус. объектно-реляционное отображение) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных».***)
|
||||
|
||||
NoSQL является горячей темой в последние годы. Большинство новых сайтов решили использовать базу данных NoSQL в качестве основной базы данных, а не только для использования кэша. Я расскажу подробнее о двух NoSQL базах данных - MongoDB и Redis в разделе 5.6.
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ drivers[name] = driver
|
||||
Open(name string) (Conn, error)
|
||||
}
|
||||
|
||||
`Conn` - это одноразовое соединение. Это означает, что его можно использовать только один раз в одной горутине. Следующй код вызовет исключение:
|
||||
`Conn` - это одноразовое соединение. Это означает, что его можно использовать только один раз в одной горутине. Следующий код вызовет исключение:
|
||||
|
||||
...
|
||||
go goroutineA (Conn) // запрос
|
||||
@@ -148,7 +148,7 @@ driver.Rows - это интерфейс для возвращения резул
|
||||
|
||||
type Value interface{}
|
||||
|
||||
`Value` должно быть содержать значения, совместимые с драйвером, или быть nil, поэтому оно должно быть одним из следующих типов:
|
||||
`Value` должно содержать значения, совместимые с драйвером, или быть nil, поэтому оно должно быть одним из следующих типов:
|
||||
|
||||
int64
|
||||
float64
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 5.2 MySQL
|
||||
|
||||
Комплекс северного программного обеспечения LAMP последние годы очень популярен в интернете. Буква М в данном акрониме означает MySQL. MySQL является наиболее известной базой данных с открытым исходным кодом. Она проста в использовании, поэтому ее часто используют в бэкенде множества веб-сайтов.
|
||||
Комплекс серверного программного обеспечения LAMP последние годы очень популярен в интернете. Буква М в данном акрониме означает MySQL. MySQL является наиболее известной базой данных с открытым исходным кодом. Она проста в использовании, поэтому ее часто используют в бэкенде множества веб-сайтов.
|
||||
|
||||
## Драйвера MySQL
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 5.3 SQLite
|
||||
|
||||
SQLite это открытая встраиваемая реляционная база данных. Она автономна, не требует конфигурации и является полноценной СУБД. Ее основные характеристики это: высокая портативность, простота использования, эффективность и надежость. В большинстве случаев вам нужен только двоичный файл SQLite для создания, подключения и эксплуатации базы данных. Если вы ищите встраиваемое решение СУБД, вам стоит рассмотреть SQLite. По сути SQLite является версией Access с открыты исходным кодом.
|
||||
SQLite - это открытая, встраиваемая, реляционная база данных. Она автономна, не требует конфигурации и является полноценной СУБД. Ее основные характеристики это: высокая портативность, простота использования, эффективность и надежность. В большинстве случаев вам нужен только двоичный файл SQLite для создания, подключения и эксплуатации базы данных. Если вы ищите встраиваемое решение СУБД, вам стоит рассмотреть SQLite. По сути SQLite является версией Access с открытым исходным кодом.
|
||||
|
||||
## Драйвера SQLite
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 5.4 PostgreSQL
|
||||
|
||||
PostgreSQL - свободная объектно-реляционная система управления базами данных доступная для множества платформ, включая Linux, FreeBSD, Solaris, Microsoft Windows и Mac OS X. Выпускается под собственной MIT-подобной лицензией. В отличие от MySQL, она разработана и позиционируется для использования в корпоративном сегменте, как Oracle. Так что PostgreSQL - это хороший выбор для использования в корпоративных проектах.
|
||||
PostgreSQL - свободная, объектно-реляционная система управления базами данных, доступная для множества платформ, включая Linux, FreeBSD, Solaris, Microsoft Windows и Mac OS X. Выпускается под собственной MIT-подобной лицензией. В отличие от MySQL, она разработана и позиционируется для использования в корпоративном сегменте, как Oracle. Так что PostgreSQL - это хороший выбор для использования в корпоративных проектах.
|
||||
|
||||
## Драйвера PostgreSQL
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# 6 Хранение данных и сессии
|
||||
# 6. Хранение данных и сессии
|
||||
|
||||
Хорошие впечатления пользователей - важная тема в web-разработке, однако тот факт, что HTTP является протоколом без сохранения состояния, кажется противоречит этому тезису. Как мы можем контролировать процесс просмотра web-страниц пользователями? Классическим решением является использование куки(cookies) и сессий. Куки хранятся на стороне клиента, а сессии, с уникальным идентификатором для каждого пользователя, на стороне сервера.Обратите внимание, что идентификаторы сессий можно хранить не только в URL, и куки-файлах, но также в базе данных, что намного более безопасно, но может сказаться на производительности приложения.
|
||||
Хорошие впечатления пользователей - важная тема в web-разработке, однако тот факт, что HTTP является протоколом без сохранения состояния, кажется, противоречит этому тезису. Как мы можем контролировать процесс просмотра web-страниц пользователями? Классическим решением является использование куки(cookies) и сессий. Куки хранятся на стороне клиента, а сессии, с уникальным идентификатором для каждого пользователя, на стороне сервера. Обратите внимание, что идентификаторы сессий можно хранить не только в URL и куки-файлах, но также и в базе данных, что намного более безопасно, но может сказаться на производительности приложения.
|
||||
|
||||
В разделе 6.1 мы будем говорит о различиях между сессиями и куки-файлами. В разделе 6.2 вы узнаете, как использовать сессии в Go с помощью реализации менеджера сессий. В разделе
|
||||
В разделе 6.1 мы будем говорить о различиях между сессиями и куки-файлами. В разделе 6.2 вы узнаете, как использовать сессии в Go с помощью реализации менеджера сессий. В разделе
|
||||
6.3 мы будем говорить о способах угона(hijacking) сессий и как его предотвратить, в том случае, если вы знаете, что идентификатор сессии может быть сохранен где угодно. Менеджер
|
||||
сеансов, который мы реализуем в разделе 6.3 будет хранить сессии в памяти, но если вам необходимо масштабировать приложение, чтобы обеспечить общий доступ к сессиям, то всегда
|
||||
лучше хранить их непосредственно в базе данных. Мы поговорим об этом подробнее в разделе 6.4
|
||||
|
||||
Reference in New Issue
Block a user