Привет, ребята, я Сэм Чжан.
Сегодня я хотел изучить область разработки бэкенда – поэтому я выбрал Go. Основная причина, по которой я выбрал Go вместо других языков (таких как Java), заключается в том, что Go – это вроде как новый язык (по крайней мере, на мой взгляд).
И, к сожалению, у меня нет абсолютно никакого опыта в разработке на Go. Поэтому я начал эту серию блогов, чтобы следить за собой. Я буду стараться “записывать” то, что я сделал, и писать некоторые основные концепции в своих постах.
Конечно, поскольку я все еще начинающий (или новичок?) в Go, здесь могут быть некоторые неправильные вещи. Если это так, пожалуйста, оставьте мне комментарий, чтобы помочь мне исправиться!
Тогда давайте начнем!
Установка Go
В отличие от многих других языков, установка Go довольно проста, по крайней мере, для меня.
Скачайте официальную программу установки на странице загрузки Go. Запустите его, и все готово!
По умолчанию Go поставляется с инструментом командной строки go
. Он включает в себя набор команд, таких как run
, get
, mod
и т.д. Наверняка, в этой серии я буду часто использовать эти команды. Ознакомьтесь с полным списком команд здесь.
Установка Gin
Я погуглил о том, какой веб-фреймворк Go является лучшим для начинающих, но оказалось, что это не так уж и полезно. Однако во многих из них упоминался Gin, который имеет почти 60 тысяч звезд на GitHub. Поэтому я выбрал Gin в качестве своего фреймворка для начала работы.
Создайте новую папку для вашего проекта и следуйте инструкциям по установке.
Устранение неполадок
Если вы такой же новичок, как и я, вы можете столкнуться со следующей проблемой при запуске go get
:
$ go get -u github.com/gin-gonic/gin
go: go.mod file not found in current directory or any parent directory.
'go get' is no longer supported outside a module.
To build and install a command, use 'go install' with a version,
like 'go install example.com/cmd@latest'
For more information, see https://golang.org/doc/go-get-install-deprecation
or run 'go help get' or 'go help install'.
Это означает, что у вас нет модуля, созданного в текущей папке. go mod
– это команда для управления модулями Go. Мы будем использовать команду go mod init
для создания нового модуля.
Команда go mod init
принимает один аргумент, module-path . Я сейчас не очень уверен в этом аргументе и понимаю его как имя модуля. Формат module-path должен быть следующим:
lorem/ipsum/dor
Затем запустите go mod init <module-path>
, заменив <module-path>
на ваш собственный путь к модулю. После этого вы сможете правильно установить gin-gonic
.
Написание первого запроса Gin
Итак, теперь у нас все готово с окружениями. Давайте напишем простой запрос “Hello World” на языке Go.
Создайте новый файл с именем main.go
в корневой папке и заполните его следующим кодом:
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default() // router with default middleware installed
// index route
router.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello World",
})
})
// run the server
router.Run()
}
Затем запустите go run main.go
и откройте http://localhost:8080 . Надеюсь, Hello World появится нормально:
{
"message": "Hello World"
}
Понимание кода Hello World
Итак… что, черт возьми, здесь происходит? Давайте посмотрим на наш код.
Мы объявили пакет main
и импортировали несколько полезных пакетов в наш код. Я постараюсь изо всех сил объяснить код функции main()
построчно.
Итак, в строке 10 мы объявили переменную router
. gin.Default
возвращает маршрутизатор с подключенным промежуточным ПО по умолчанию (такие вещи, как Logger и Recovery middleware). Вы можете задаться вопросом, что такое :=
? Ну, это похоже на =
в других языках программирования. В Golang один =
означает присвоение, а :=
означает объявление и присвоение. Например:
var router = gin.Default()
Эквивалентно:
router := gin.Default()
Оператор :=
используется в объявлениях коротких переменных. Более подробную информацию см. в этом вопросе на StackOverflow.
В строках 12 ~ 16 мы определили GET-запрос, который отображается на /
и возвращает JSON-ответ. router.GET()
, конечно же, определяет GET-запрос. Его второй аргумент принимает вызываемую функцию, а эта функция получает аргумент с типом gin.Context
.
В данном случае переменная контекста имеет имя c
. *gin.Context
– это указатель на значение gin.Context
. Контексты в Gin предоставляют множество возможностей, таких как промежуточное программное обеспечение и ответы. Для китайских читателей вы можете взглянуть на эту статью для более детального рассмотрения gin.Context
.
В строке 13 мы вызвали c.JSON()
, чтобы ответить на этот запрос с содержимым, MIME-тип которого application/json
. http.StatusOK
– это константная переменная для кода состояния HTTP 200 success
, которая взята из встроенного пакета net/http
.
gin.H
– это сокращенная версия определения типа для данных JSON. Если вы хотите вложить объекты JSON внутрь объектов JSON, вы можете написать что-то вроде:
gin.H{
"some-data": gin.H{
"message": "success"
}
}
И наконец, в строке 18 мы запускаем сервер на стандартном порту 8080.
Живая перезагрузка
Теперь, если вы захотите изменить содержимое вашего Go-приложения, вам нужно будет перезапускать сервер разработки каждый раз, когда вы что-то измените, чтобы протестировать вновь добавленный код.
Поэтому некоторые веб-фреймворки (например, Python Flask) имеют встроенный горячий перезагрузчик для сервера разработки. К сожалению, Gin не поставляется с этим. Я решил использовать Air в качестве автозагрузчика, но, конечно, вы можете использовать и другие.
Установить Air довольно просто. Выполните следующую команду, чтобы установить его:
curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s -- -b $(go env GOPATH)/bin
Это установит Air в ваш $GOPATH
, который по умолчанию ~/go
. Затем добавьте его в ваш $PATH
, добавив следующую строку в ваш .bashrc
(или .zshrc
):
export PATH=$PATH:$(go env GOPATH)/bin
…и все готово! Запустите air init
, чтобы создать конфигурацию Air по умолчанию.
Использовать Air еще проще. Просто запустите air
в командной строке, и Air запустит main.go
в текущей папке и будет автоматически следить за изменениями в вашем исходном коде.
Совет для пользователей macOS: если вы не хотите видеть раздражающее всплывающее окно каждый раз, когда Air перезагружает ваш код, просто замените
router.Run()
на
router.Run("localhost:8080")
Заключение
Итак… Я наконец-то закончил Gin hello world! Я выложил весь исходный код на GitHub и, надеюсь, буду его обновлять. Клонируйте его, если вы нашли что-то полезное или просто хотите поиграть!
Я Сэм Чжан, увидимся в следующий раз!