писать по незнаниюGo
Прошел почти год, запущено несколько проектов разного масштаба, менталитет тоже претерпел несколько раундов изменений.
Потому что я лично писал о первых пятилеткахJava
, на полпути к написанию более годаPython
, Ощущения от только что подвергшегося воздействию Go следующие:
ни одинJava
экология, ниPython
Столько синтаксического сахара.
Когда я пишу это сейчас, это выглядит так:
Мы не будем здесь обсуждать, кто сильнее, а кто слабее в этих языках, цель — поделиться с вами некоторыми сторонними библиотеками и инструментами, которые мы используем в нашей повседневной разработке.
Здесь я в основном делю эти библиотеки на две категории:
- развитие бизнеса
- Базовая разработка инструмента
развитие бизнеса
Во-первых, это развитие бизнеса, которое в основном включает в себяweb
,база данных,Redis
Ждать.
Джин ⭐️⭐️⭐️⭐️⭐️
прежде всегоGin, HTTP-фреймворк, простой в использовании, отличная производительность и множество материалов; когда вы все еще сомневаетесь, какой фреймворк выбрать, просто выберите его, в основном правильно.
Конечно, это идет с нимGitHub.com/stockings ad oh/gin-…Инструмент swagger также просто необходим, его можно использовать для создания документации swagger.
ГОРМ ⭐️⭐️⭐️⭐️⭐️
GORMНечего сказать, если хотитеorm
Способ работы с базой данных, затем выберите его, то же самое и просто в использовании, больше данных.
Если есть необходимость в разделении чтения-записи, вы также можете использоватьGORM
Официально предоставленные плагиныGitHub.com/go-G ORM/Северо-восточный…,сотрудничатьGORM
Он также очень прост в использовании.
ошибки ⭐️⭐️⭐️⭐️⭐️
Обработка ошибок, предоставляемая самим языком Go, относительно проста.github.com/pkg/errorsПредоставляет более мощные функции, такие как:
- Исключение упаковки
- Упаковочные стеллажи и т.д.
Обычно используются следующие API:
// WithMessagef annotates err with the format specifier.
func WithMessagef(err error, format string, args ...interface{}) error
// WithStack annotates err with a stack trace at the point WithStack was called.
func WithStack(err error) error
зоролог ⭐️⭐️⭐️⭐️⭐️
В Go есть много библиотек для печати журналов, и лучше всего, чтобы журналы имели низкий уровень присутствия в повседневной разработке, то есть производительность была высокой (не могла повлиять на бизнес-код), а API был простым в использовании. .
"github.com/rs/zerolog/log"
log.Debug().Msgf("OrderID :%s", "12121")
excelize
GitHub.com/ go ah first-OS/ альбом…Это библиотека для чтения и записи Excel, и она может в основном реализовывать операции Excel, с которыми вы можете столкнуться.
сейчас ⭐️⭐️⭐️⭐️
github.com/jinzhu/nowэто библиотека инструментов времени:
- Получить текущий год, месяц, день, час, минуту и секунду.
- Поддержка разных часовых поясов.
- На прошлой неделе, в прошлом месяце и т.
import "github.com/jinzhu/now"
time.Now() // 2013-11-18 17:51:49.123456789 Mon
now.BeginningOfMinute() // 2013-11-18 17:51:00 Mon
now.BeginningOfHour() // 2013-11-18 17:00:00 Mon
now.BeginningOfDay() // 2013-11-18 00:00:00 Mon
now.BeginningOfWeek() // 2013-11-17 00:00:00 Sun
now.BeginningOfMonth() // 2013-11-01 00:00:00 Fri
now.BeginningOfQuarter() // 2013-10-01 00:00:00 Tue
now.BeginningOfYear() // 2013-01-01 00:00:00 Tue
now.EndOfMinute() // 2013-11-18 17:51:59.999999999 Mon
now.EndOfHour() // 2013-11-18 17:59:59.999999999 Mon
now.EndOfDay() // 2013-11-18 23:59:59.999999999 Mon
now.EndOfWeek() // 2013-11-23 23:59:59.999999999 Sat
now.EndOfMonth() // 2013-11-30 23:59:59.999999999 Sat
now.EndOfQuarter() // 2013-12-31 23:59:59.999999999 Tue
now.EndOfYear() // 2013-12-31 23:59:59.999999999 Tue
now.WeekStartDay = time.Monday // Set Monday as first day, default is Sunday
now.EndOfWeek() // 2013-11-24 23:59:59.999999999 Sun
Десятичный ⭐️⭐️⭐️⭐️
Когда бизнес требует точного расчетаGitHub.com/shopspring/…может помочь.
import (
"fmt"
"github.com/shopspring/decimal"
)
func main() {
price, err := decimal.NewFromString("136.02")
quantity := decimal.NewFromInt(3)
fee, _ := decimal.NewFromString(".035")
taxRate, _ := decimal.NewFromString(".08875")
subtotal := price.Mul(quantity)
preTax := subtotal.Mul(fee.Add(decimal.NewFromFloat(1)))
total := preTax.Mul(taxRate.Add(decimal.NewFromFloat(1)))
fmt.Println("Subtotal:", subtotal) // Subtotal: 408.06
fmt.Println("Pre-tax:", preTax) // Pre-tax: 422.3421
fmt.Println("Taxes:", total.Sub(preTax)) // Taxes: 37.482861375
fmt.Println("Total:", total) // Total: 459.824961375
fmt.Println("Tax rate:", total.Sub(preTax).Div(preTax)) // Tax rate: 0.08875
}
По сути, он может выполнять любое точное преобразование, о котором вы только можете подумать;GORM
так же может бытьmodel
Поле объявлено какdecimal
Тип базы данных соответствуетdecimal
, им будет удобнее пользоваться.
Amount decimal.Decimal `gorm:"column:amout;default:0.0000;NOT NULL" json:"amout"`
конфиг ⭐️⭐️⭐️⭐️
GitHub.com/in/conf…это библиотека чтения конфигурационных файлов, которая поддерживаетYAML/JSON/TOML
формат.
иди кеш ⭐️⭐️⭐️
GitHub.com/Патрик Мн/…похож на JavaGuava cache
, потокобезопасный и простой в использовании; можно рассмотреть простые сценарии, не требующие распределенного кэширования.
c := cache.New(5*time.Minute, 10*time.Minute)
// Set the value of the key "foo" to "bar", with the default expiration time
c.Set("foo", "bar", cache.DefaultExpiration)
копировальный аппарат ⭐️⭐️⭐️
GitHub.com/enter/produce о, пердеть…Из названия вы знаете, что это библиотека репликации данных, которая похожа наJava
серединаBeanUtils.copy()
Аналогично; два поля с одинаковыми полями, но разными объектами могут бытьstruct
Выполнять репликацию данных, а также поддерживать глубокое копирование.
func Copy(toValue interface{}, fromValue interface{}) (err error)
Это очень полезно, когда нам нужна временная структура для хранения данных, особенно когда в структуре много полей, и назначать их туда-сюда одно за другим действительно несложно.
Но также будьте осторожны, чтобы не использовать его во всех ситуациях, это принесет некоторые неудобства:
- Вы не можете воспользоваться подсказками компилятора при удалении полей.
- Когда некоторые поля требуют дополнительной ручной обработки, код становится неудобным для чтения.
- Назначение отражения, есть определенная потеря производительности.
Короче говоря, в бизнес-разработке рекомендуется писать вручную, ведь код должен быть виден людям.
⭐️⭐️⭐️
GitHub.com/CAA RL OS0/En…Эта библиотека может преобразовать наши переменные среды вstruct
.
type config struct {
Home string `env:"HOME"`
}
func main() {
cfg := config{}
if err := env.Parse(&cfg); err != nil {
fmt.Printf("%+v\n", err)
}
fmt.Printf("%+v\n", cfg)
}
Это очень полезно, когда мы упаковываем код в разные среды выполнения, и его можно использовать для простого получения различных переменных среды.
user_agent ⭐️⭐️⭐️
GitHub.com/Magic Ola/пользователь…это форматuser-agent
гаджет.
Когда нам нужно собрать на сервереuser-agen
данные могут быть прочитаны быстрее.
func main() {
ua := user_agent.New("Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1")
fmt.Printf("%v\n", ua.Mobile()) // => true
fmt.Printf("%v\n", ua.Bot()) // => false
fmt.Printf("%v\n", ua.Mozilla()) // => "5.0"
fmt.Printf("%v\n", ua.Model()) // => "Nexus One"
fmt.Printf("%v\n", ua.Platform()) // => "Linux"
fmt.Printf("%v\n", ua.OS())
}
номера телефонов ⭐️⭐️⭐️
GitHub.com/Ты как карта/Поврежден...Библиотека проверки номера мобильного телефона, вам не нужно самостоятельно писать регулярные выражения.
// parse our phone number
num, err := phonenumbers.Parse("6502530000", "US")
основные инструменты
Далее приведены некоторые основные библиотеки инструментов, в том числе некоторые основные клиенты хранилища, промежуточное ПО и т. д.
Гомонки ⭐️⭐️⭐️⭐️⭐️
GitHub.com/проворный дракон…Являетсяmock
Инструмент для нагромождения, когда мы пишем юнит-тесты, нам нужно выполнять какие-то не интерфейсные функцииmock
Это будет сложнее, и тогда вам нужно это использовать.
Поскольку он изменяет инструкцию машинного перехода при вызове соответствующей функции, а соответствующие инструкции для разных архитектур ЦП также различаются, он несовместим с чипом Apple M1, когда мы его используем, но теперь он должен быть совместим, вы можете попробовать.
иди ⭐️⭐️⭐️⭐️⭐️
GitHub.com/умное дерево…Это также библиотека для модульного тестирования, совместимая сgo test
Заказ.
- Предоставляет визуальный веб-интерфейс.
- Интеграция с IDE для отображения покрытия сотовой связи.
копать ⭐️⭐️⭐️⭐️⭐️
github.com/uber-go/digЭто библиотека для внедрения зависимостей, мы не будем здесь обсуждать, следует ли использовать внедрение зависимостей, по крайней мере, пока у нас все еще есть несколько преимуществ:
- Все объекты являются синглтонами.
- Есть единое место для управления объектами.
- При его использовании вы можете напрямую передать объект в качестве параметра (контейнер автоматически внедрит его).
Конечно, есть и неудобные места:
- Когда незнакомо, непонятно, как создается объект.
- Код не очень хорошо понятен.
Мы разработали бизнес-фреймворк внутри, в котором все объекты управляются dig, что более удобно в использовании.
кобра ⭐️⭐️⭐️⭐️
github.com/spf13/cobraЭто мощная библиотека инструментов командной строки, мы используем ее для реализации внутренних инструментов командной строки, также рекомендуется использоватьgithub.com/urfave/cli/Лично мне было бы удобнее использовать последнее, если быть более кратким.
БлумРПЦ ⭐️⭐️⭐️⭐️
GitHub.com/U for-labs/ нет...ОдинgRPC
Инструмент визуализации по сравнению с написанием самостоятельноgRPC
Клиентский код действительно намного проще.
Но есть некоторые незначительные проблемы, такие как точность. Если значение int64 превысит 2^56, произойдет ошибка, которая еще не устранена.
редис ⭐️⭐️⭐️⭐️
GitHub.com/go-Redis/hot…Клиент Redis, тут особо нечего сказать, он разрабатывался много лет, и у него есть все функции, которые он должен иметь.
эластичный ⭐️⭐️⭐️⭐️
GitHub.com/Oliver E/голодные друзья...Это тоже очень взрослоеelasticsearch
библиотека.
рестай ⭐️⭐️⭐️⭐️
GitHub.com/go-rest/hot…HTTP-клиент, очень простой в использовании:
// Create a Resty Client
client := resty.New()
resp, err := client.R().
EnableTrace().
Get("https://httpbin.org/get")
немногоPython requests
Упакуйте этот вкус.
пульсар-клиент-го ⭐️⭐️⭐️
Клиент языка go официально выпускаемый Pulsar, по сравнению с Java, клиенты других языков почти все мачехи, функций будет меньше, и обновления не такие активные, но выбора нет.
go-grpc-промежуточное ПО ⭐️⭐️⭐️
GitHub.com/Personal PC-Eco sys…официально предоставленgRPC
Промежуточное ПО само по себе может реализовывать некоторые внутренние функции аутентификации, метаданных, ведения журналов и другие функции.
го-пилоса ⭐️⭐️⭐️
GitHub.com/farts/go-afraid…Это клиент растровой базы данных.Сценарное применение растровой базы данных относительно ограничено и обычно используется, когда есть потребность в метках, например, чтобы найти пересечение, объединение и дополнение N меток, после того, как данные определенного масштаба, операция обязательно предоставит соответствующую информацию потребности, может быть подготовлена к чрезвычайным ситуациям.
пб ⭐️⭐️⭐️
github.com/cheggaaa/pbИндикатор выполнения инструмента командной строки, с которым удобнее взаимодействовать при написании инструментов командной строки.
Суммировать
Наконец, я составил таблицу для удобства просмотра:
название | тип | Функции | звезда |
---|---|---|---|
Gin | развитие бизнеса |
HTTP Рамка |
⭐️⭐️⭐️⭐️⭐️ |
GORM | развитие бизнеса |
ORM Рамка |
⭐️⭐️⭐️⭐️⭐️ |
errors | развитие бизнеса | библиотека обработки исключений | ⭐️⭐️⭐️⭐️⭐️ |
zorolog | развитие бизнеса | библиотека журналов | ⭐️⭐️⭐️⭐️⭐️ |
excelize | развитие бизнеса |
Excel Связанные потребности |
⭐️⭐️⭐️⭐️⭐️ |
now | развитие бизнеса | обработка времени | ⭐️⭐️⭐️⭐️️ |
Decimal | развитие бизнеса | Прецизионная обработка | ⭐️⭐️⭐️⭐️️ |
configor | развитие бизнеса | конфигурационный файл | ⭐️⭐️⭐️⭐️️ |
go-cache | развитие бизнеса | локальный кеш | ⭐️⭐️⭐️ |
copier | развитие бизнеса | репликация данных | ⭐️⭐️⭐️️️ |
env | развитие бизнеса | переменная среды | ⭐️⭐️⭐️️️ |
user_agent | развитие бизнеса | читатьuser-agent
|
⭐️⭐️⭐️️️ |
phonenumbers | развитие бизнеса | Верификация мобильного номера | ⭐️⭐️⭐️️️ |
gomonkey | основные инструменты |
mock инструмент |
⭐️⭐️⭐️⭐️⭐ |
goconvey | основные инструменты | Одно тестовое покрытие | ⭐️⭐️⭐️⭐️⭐ |
dig | основные инструменты | внедрение зависимости | ⭐️⭐️⭐️⭐️⭐ |
cobra | основные инструменты | инструмент командной строки | ⭐️⭐️⭐️⭐ |
cli | основные инструменты | инструмент командной строки | ⭐️⭐️⭐️⭐ |
BloomRPC | основные инструменты |
gRPC отладочный клиент |
⭐️⭐️⭐️⭐ |
redis | основные инструменты | Клиент Redis | ⭐️⭐️⭐️⭐ |
elastic | основные инструменты |
elasticsearch клиент |
⭐️⭐️⭐️⭐ |
resty | основные инструменты | http-клиент | ⭐️⭐️⭐️⭐ |
pulsar-client-go | основные инструменты |
Pulsar клиент |
⭐️⭐️⭐️ |
go-grpc-middleware | основные инструменты |
gRPC промежуточное ПО |
⭐️⭐️⭐ |
go-pilosa | основные инструменты |
pilosa клиент |
⭐️⭐️⭐️ |
pb | основные инструменты | Индикатор выполнения инструмента командной строки | ⭐️⭐️⭐️ |
Правило звездного рейтинга в основном зависит от частоты фактического использования.
Наконец, увозится немного личного добра (на самом деле этого нельзя сказать) В статье упоминается, что мы интегрировали фреймворк для развития бизнеса на основе вышеперечисленных библиотек, также мы запустили более 10 проектов, больших и малых, на основе этого фреймворка, еще есть много возможностей для улучшения, и это все еще находится в быстрой итерации.
Примерное использование, записьmain.go
:
Наконец, перехват моего внутреннего обмена резюмирует общую идею--引用自公司一司姓同事
.
Может быть, после многих внутренних итераций мы попытаемся открыть исходный код, когда почувствуем, что у нас есть возможность открыться и принести некоторую помощь сообществу; на данном этапе это не так уж безобразно.
Эти библиотеки чаще всего используются в нашей повседневной разработке, и вы можете оставить свои часто используемые библиотеки и инструменты в области комментариев.