"Создайте свой собственный праздничный API"

задняя часть Go программист поисковый движок

RickAndMorty.png

Всем привет, меня зовут Се Вэй, я программист.

Раньше я прочесывал изучение некоторых встроенных библиотек и получил несколько комментариев, большинство из которых прямо указывают на вопрос: зачем прочесывать эти безобидные встроенные библиотеки?

Что ж, похоже, это сочетание некоторых простых встроенных библиотек. Основная причина заключается в следующем:«Стратегия для бэкенд-инженеров»Эта серия, начиная с нуля, и учебник до этого момента, кажется, должны увеличить сложность. для улучшения позже. Другая причина состоит в том, чтобы на самом деле сообщить новичкам, что многие методы организации кода встроенных библиотек и способ написания кода связаны с изучением, изучением и справкой.

Этот выпуск был подготовлен мной ранее, поэтому давайте воспользуемся этим выпуском и выпустим его в эфир.

Суть очень проста: понять базовый синтаксис Go и использовать встроенную библиотеку времени, вы в принципе можете их получить.

Контур:

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

  • Например, более глупый способ: поисковик, ручная сортировка
  • Используйте некоторые бесплатные и открытые сторонние API для праздников: не стабильно, хотя эти данные не требуют частого использования.
  • Используйте некоторые платные сторонние API для праздников: платно

Итак, лаконично напишите такую ​​праздничную библиотеку.

Требовать:

  • простая функция
  • Простой API

1. Сбор данных

Источники данных должны быть надежными, поэтому ищите официальные источники уведомлений.

Например:Уведомление Главного управления Госсовета о порядке проведения некоторых праздников в 2018 году

Общий способ заключается в сканировании данных веб-страницы и анализе полученных данных.

Это первый шаг, получение данных, конечно, эту информацию можно найти на многих сайтах, но это просто пример.

2. Определите структуру

Какую информацию нам больше всего нужно знать о праздниках?

  • название
  • Расписание

Исходя из этого, конструкцию можно спроектировать так:

type OneCollection struct {
	Start  string `json:"start"`
	End    string `json:"end"`
	ChName string `json:"ch_name"`
	EnName string `json:"en_name"`
}

включать:

  • китайское имя
  • английское имя
  • Время начала
  • Время окончания

Что касается названий праздников, то национальные официальные праздники следующие: Новый год, Праздник Весны, Праздник Цинмин, Праздник лодок-драконов, Праздник труда, Праздник середины осени, Национальный день.

Изучите методы обработки многих встроенных библиотек: это фиксированная обработка данных, вы можете использовать типы перечисления:

const (
	NewYearDay = iota
	SpringFestivalDay
	TombSweepingDay
	LaborDay
	DragonBoatFestivalDay
	NationalDay
	MidAutumnFestivalDay
)

var ChHolidays = [...]string{
	"元旦",
	"春节",
	"清明节",
	"劳动节",
	"端午节",
	"中秋节",
	"国庆节",
}
var EnHolidays = [...]string{
	"New Year\\'s Day",
	"Spring Festival",
	"Tomb-sweeping Day",
	"Labour Day",
	"Dragon Boat Festival",
	"Mid-autumn Festival",
	"National Day",
}

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

3. Исторические данные

На основе вышеприведенного анализа, для построения этой простой библиотеки и организации исторических праздников здесь выбраны данные с 2010 по 2019 год.

// 一年
type YearCollection struct {
	Data []OneCollection `json:"data"`
}
// n 年
type CollectionYearHistory struct {
	Data [][]OneCollection `json:"data"`
}

// 2010 年到 2019年历史数据
func FetchCollectionYearHistory() CollectionYearHistory {
	return CollectionYearHistory{
		Data: [][]OneCollection{
			holiday2019,
			holiday2018,
			holiday2017,
			holiday2016,
			holiday2015,
			holiday2014,
			holiday2013,
			holiday2012,
			holiday2011,
			holiday2010,
		},
	}
}

4. Создайте API

  • Выберите хороший метод именования
  • Выбранный формат возврата данных
- FetchAll
- FetchByChName(year int, name string)
- FetchByEnName(year int, name string)
- FetchByMonth(year int, month int)
- FetchByYear(year int)
- FetchMonthHolidayCount(year int, month int)
- FetchYearHolidayCount(year int)
- IsHoliday
- IsWeekDay
- IsWorkDay

Причина такой конструкции в том, что в проекте часто бывает так:

  • Получить все исторические данные
  • Получить исторические данные за год
  • Получить исторические данные за месяц
  • Подсчитать количество дней отпуска в определенном месяце в определенном году
  • Подсчитать количество дней отпуска в году
  • Определить, является ли дата праздником
  • Определить, является ли дата выходным
  • Определить, является ли дата рабочим днем

На основе этих требований построен вышеуказанный API.

Взяв за пример несколько API, как реализовать детальные операции?

  • FetchByYear(year int): выборка из исторических данных
// FetchByYear get holidays by year in china
func FetchByYear(year int) []history.OneCollection {
	var index int
	nowYear, _, _ := time.Now().Date()
	if year > nowYear+1 {
		return nil
	}
	index = nowYear + 1 - year
	return history.FetchCollectionYearHistory().Data[index]

}
  • FetchByMonth: выборка из исторических данных за определенный год.
func FetchByMonth(year int, month int) []history.OneCollection {
	if month < 1 || month > 12 {
		return nil

	}
	collections := FetchByYear(year)
	var data []history.OneCollection
	for _, collection := range collections {
		collectionTime, _ := time.Parse("2006/01/02", collection.End)
		if int(collectionTime.Month()) == month {
			data = append(data, collection)
		}
	}
	return data
}
  • IsHoliday: может ли цель быть достигнута в исторических данных.
func IsHoliday(value string) bool {
	collectionTime, err := time.Parse("2006/01/02", value)
	if err != nil {
		return false
	}
	nowYear, _, _ := time.Now().Date()
	if collectionTime.Year() > nowYear+1 {
		return false
	}
	collections := FetchByYear(collectionTime.Year())
	for _, collection := range collections {
		startDate, _ := getDate(collection.Start)
		endDate, _ := getDate(collection.End)
		if collectionTime.Unix() >= startDate.Unix() && collectionTime.Unix() <= endDate.Unix() {
			return true
		}
	}
	return false

}
  • IsWeekDay: Не праздник, не будний день
// IsWeekDay: judge date is week day or not
func IsWeekDay(value string) bool {
	return !IsWorkDay(value) && !IsHoliday(value)
}
  • holidaysтолько для справки

На основе приведенных выше концепций действительно можно написать множество гаджетов:

Например:

  • Получить древние стихи
  • Учитывая дату, определите созвездие
  • Имея удостоверение личности, определите, действительна ли она, к какому региону относится и т. д.
  • Учитывая ip, укажите географическое положение
  • Учитывая китайский, дайте английский или пиньинь
  • Учитывая текст, объясните его значение на китайском языке. ...