未验证 提交 697e36b2 编写于 作者: A astaxie 提交者: GitHub

Merge pull request #1169 from KirillMerz/fix_errors

Fix errors & format num of chapters
......@@ -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.4 Инструменты разработки для Go
В этом разделе я ознакомлю Вас с несколькими средами разработки (IDE), которые помогут Вам более эффективно программировать. Они обладают такими возможностями как умное автодополнение и автоформатирование. Все они кроссплатформенные, поэтому шаги по настройке, которые я покажу, не будут слишком отличаться в зависимости от операционной системы, которую Вы используете.
В этом разделе я ознакомлю Вас с несколькими средами разработки (IDE), которые помогут Вам более эффективно программировать. Они обладают такими возможностями, как умное автодополнение и автоформатирование. Все они кроссплатформенные, поэтому шаги по настройке, которые я покажу, не будут слишком отличаться в зависимости от операционной системы, которую Вы используете.
## LiteIDE
LiteIDE - нетребовательный к ресурсам системы IDE с открытым исходным кодом, который предназначен для разработки проектов только на Go. Он разработан visualfc.
LiteIDE - нетребовательная к ресурсам системы IDE с открытым исходным кодом, которая предназначена для разработки проектов только на Go. Она разработана visualfc.
![](images/1.4.liteide.png?raw=true)
......@@ -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, соответствующую Вашей операционной системе. Распакуйте скачанный пакет.
......
# 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 может быть по-настоящему веселым. После того, как вы закончите эту главу, вы будете знакомы с упомянутыми ключевыми словами.
## Ссылки
......
# 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)
......
# 3 Основы Веба
# 3. Основы Веба
Основной причиной, по которой вы читаете эту книгу, является желание научиться создавать веб-приложения на языке Go. Как я уже говорил ранее, Go предоставляет много мощных пакетов, способных справляться с этой задачей, например пакет «http». Этот пакет поможет вам создавать web-приложения. Я объясню Вам все что вы должны знать о разработке веб-приложений в следующих главах, а сейчас мы поговорим о концепции Веба и о том как запускать веб-приложения в Go.
Основной причиной, по которой вы читаете эту книгу, является желание научиться создавать веб-приложения на языке Go. Как я уже говорил ранее, Go предоставляет много мощных пакетов, способных справляться с этой задачей, например пакет «http». Этот пакет поможет вам создавать web-приложения. Я объясню Вам все, что вы должны знать о разработке веб-приложений, в следующих главах, а сейчас мы поговорим о концепции Веба и о том, как запускать веб-приложения в Go.
## Ссылки
......
# Принципы работы веб
# 3.1 Принципы работы веб
Каждый раз, когда Вы открываете браузер, вводите URL-адрес и нажимаете клавишу enter, вы видите красивые веб-страницы на вашем экране. Но знаете ли вы, что стоит за этим простым действием?
......@@ -35,7 +35,7 @@ URL расшифровывается как Uniform Resource Locator, в пер
<параметры> данные, которые будут отправлены на сервер
<якорь> якорь
DNS-это аббревиатура  Domain Name System - система доменных имен. Это система имен для компьютерных сетевых служб , которая преобразует доменное имя в фактические IP-адреса (своеобразный переводчик).
DNS - это аббревиатура Domain Name System - система доменных имен. Это система имен для компьютерных сетевых служб, которая преобразует доменное имя в фактические IP-адреса (своеобразный переводчик).
![](images/3.1.dns_hierachy.png?raw=true)
......@@ -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.
В данном разделе мы использовали две простые функции для создания простого веб-сервера который уже готов к параллельным вычислениям. В следующих двух разделах мы будем говорить о том, как использовать эту особенность.
В данном разделе мы использовали две простые функции для создания простого веб-сервера, который уже готов к параллельным вычислениям. В следующих двух разделах мы будем говорить о том, как использовать эту особенность.
## Ссылки
......
......@@ -12,9 +12,9 @@ Conn: соединения между клиентами и серверами.
Handler: логика обработки запроса и генерация ответа.
## механизм работы пакета http
## Механизм работы пакета http
На следующей картинке показано как работает веб-сервер Go.
На следующей картинке показано, как работает веб-сервер Go.
![](images/3.3.http.png?raw=true)
......@@ -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`.
......
# 3.5 Итоги главы
В этой главе мы познакомились с тем как работает HTTP, разрешение имен DNS и как создать простой веб-сервер на языке Go. После этого мы обсудили как Go создает веб-сервер на примере исходных кодов пакета `net/http`.
В этой главе мы познакомились с тем, как работает HTTP, разрешение имен DNS и как создать простой веб-сервер на языке Go. После этого мы обсудили, как Go создает веб-сервер на примере исходных кодов пакета `net/http`.
Я надеюсь, вы узнали гораздо больше о веб-разработке и поняли, что создавать веб-приложения в Go достаточно легко.
......
# 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`. Давайте посмотрим, как обработать данные формы со страницы входа:
......
# 4.3 Межсайтовый скриптинг
Для совершенствования взаимодействия с пользователем современные сайты содержат все больше динамического контента, что означает, что мы должны предоставлять информацию динамически в зависимости от поведения каждого пользователя. К сожалению, существует такое явление как "межсайтовый скриптинг" (известный как "XSS"), с помощью которого осуществляются постоянные атаки на динамические сайты, в то время как сайты со статическим содержимым этим атакам не подвержены.
Для совершенствования взаимодействия с пользователем современные сайты содержат все больше динамического контента, что означает, что мы должны предоставлять информацию динамически, в зависимости от поведения каждого пользователя. К сожалению, существует такое явление как "межсайтовый скриптинг" (известный как "XSS"), с помощью которого осуществляются постоянные атаки на динамические сайты, в то время как сайты со статическим содержимым этим атакам не подвержены.
Злоумышленники посылают на сайты, подверженные межсайтовому скриптингу, скрипты на JavaScript, VBScript, ActiveX или Flash. Если скрипт удачно вторгся на сайт, пользовательская информация может быть похищена, а сайт наполнен спамом. Злоумышленники могут также изменить настройки пользователя на те, которые захотят.
......
# 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)
# 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
......
# 5.2 MySQL
Комплекс северного программного обеспечения LAMP последние годы очень популярен в интернете. Буква М в данном акрониме означает MySQL. MySQL является наиболее известной базой данных с открытым исходным кодом. Она проста в использовании, поэтому ее часто используют в бэкенде множества веб-сайтов.
Комплекс серверного программного обеспечения LAMP последние годы очень популярен в интернете. Буква М в данном акрониме означает MySQL. MySQL является наиболее известной базой данных с открытым исходным кодом. Она проста в использовании, поэтому ее часто используют в бэкенде множества веб-сайтов.
## Драйвера MySQL
......
# 5.3 SQLite
SQLite это открытая встраиваемая реляционная база данных. Она автономна, не требует конфигурации и является полноценной СУБД. Ее основные характеристики это: высокая портативность, простота использования, эффективность и надежость. В большинстве случаев вам нужен только двоичный файл SQLite для создания, подключения и эксплуатации базы данных. Если вы ищите встраиваемое решение СУБД, вам стоит рассмотреть SQLite. По сути SQLite является версией Access с открыты исходным кодом.
SQLite - это открытая, встраиваемая, реляционная база данных. Она автономна, не требует конфигурации и является полноценной СУБД. Ее основные характеристики это: высокая портативность, простота использования, эффективность и надежность. В большинстве случаев вам нужен только двоичный файл SQLite для создания, подключения и эксплуатации базы данных. Если вы ищите встраиваемое решение СУБД, вам стоит рассмотреть SQLite. По сути SQLite является версией Access с открытым исходным кодом.
## Драйвера SQLite
......
# 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
......
# 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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册