Всем привет, меня зовут Се Вэй, я программист.
Раньше я прочесывал изучение некоторых встроенных библиотек и получил несколько комментариев, большинство из которых прямо указывают на вопрос: зачем прочесывать эти безобидные встроенные библиотеки?
Что ж, похоже, это сочетание некоторых простых встроенных библиотек. Основная причина заключается в следующем:«Стратегия для бэкенд-инженеров»Эта серия, начиная с нуля, и учебник до этого момента, кажется, должны увеличить сложность. для улучшения позже. Другая причина состоит в том, чтобы на самом деле сообщить новичкам, что многие методы организации кода встроенных библиотек и способ написания кода связаны с изучением, изучением и справкой.
Этот выпуск был подготовлен мной ранее, поэтому давайте воспользуемся этим выпуском и выпустим его в эфир.
Суть очень проста: понять базовый синтаксис 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, укажите географическое положение
- Учитывая китайский, дайте английский или пиньинь
- Учитывая текст, объясните его значение на китайском языке. ...