All streams
Search
Write a publication
Pull to refresh
0
0
Вадим @MonstarNN

User

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

Для работы с SQL можем реализовать интерфейс sql.Scanner, чтобы обычная сохранённая дата, даже с долями секунд и таймзоной, интерпретировалась в нужный формат:

func (c *CustomDate) Scan(v interface{}) error {
	c.Time, ok := v.(time.Time)
	if !ok {
		return errors.New("invalid time format")
	}
	_, offset := c.Time.Zone()
	c.Time = c.Time.Add(time.Second * time.Duration(offset))
	c.Time = c.Time.Round(time.Second).UTC()
	return nil
}

И интерфейс driver.Valuer:

func (c CustomDate) Value() (driver.Value, error) {
	if с.Time.IsZero() {
		return nil, nil
	}
	return t.Time.UTC().Format(layout), nil
}

Ну и для красивого вывода в строках (не только в JSON) — интерфейс fmt.Stringer:

func (c CustomDate) String() string {
	return c.Time(c.Time.UTC()).Format(layout)
}
Ну судя по тексту, пока беспилотник не взлетел — к нему нет никаких вопросов.
Из собственного опыта — без каких-либо вопросов возил свой Мавик в Израиль. Да и у нас на Красной Поляне удалось полетать, правда, один раз на Роза-Пике застукали, но всего лишь попросили без разрешения не летать, так как граница рядом.
В описании функции не допускается многократное использование позиционных и именованных аргументов, то есть такое описание функции, как printScores(student, *scores, *otherData), или же printScores(student, **kwargs, **other_kwargs) недопустимо — интерпретатор упадёт с ошибкой «invalid syntax». Оно и понятно — если более одного набора позиционных или именованных аргументов — нет возможности однозначно поделить аргументы между ними.

Позиционные аргументы приходят в виде кортежа (tuple), который как раз определяется звёздочкой, именованные аргументы приходят в виде словаря dict, и двойная звёздочка тут есть именно задание словаря. То есть при описании функции звёздочки это не операторы, выполняющие какое-либо действие, а именно описание параметров функции, так для printScores(student, *args, **kwargs) мы указываем, что внутри функции мы будем работать с кортежем args и словарём kwargs, по которым будут «разбросаны» все позиционные и именованные аргументы вызова функции. И чтобы не было путаницы, в вызове сначала указываются позиционные параметры (попадают в кортеж args с сохранением последовательности), а потом именованные, то есть вызов printScores('name', param='value', 42) недопустим.

При вызове printScores('name', [1,2,3]) в scores будет кортеж ([1,2,3]), ну или, если кортеж преобразовать в список, то будет список: list(scores) = [[1,2,3]]

Information

Rating
Does not participate
Location
Нижний Новгород, Нижегородская обл., Россия
Date of birth
Registered
Activity