Займитесь ежедневной разработкой постоянных сторонних библиотек и инструментов

Go
Займитесь ежедневной разработкой постоянных сторонних библиотек и инструментов

писать по незнанию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: Наконец, перехват моего внутреннего обмена резюмирует общую идею--引用自公司一司姓同事.

Может быть, после многих внутренних итераций мы попытаемся открыть исходный код, когда почувствуем, что у нас есть возможность открыться и принести некоторую помощь сообществу; на данном этапе это не так уж безобразно.

Эти библиотеки чаще всего используются в нашей повседневной разработке, и вы можете оставить свои часто используемые библиотеки и инструменты в области комментариев.