Необязательные параметры в Go?

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

Рассмотрим упрощенный пример:

func getFullName(firstName string, lastName string, maybeMiddleName func() (bool, string)) string {
    if ok, middleName:= maybeMiddleName(); ok {
        return firstName + " " + middleName + " " + lastName
    }

    return firstName + " " + lastName
}

Это выглядит достаточно хорошо, мысль требует многословия на стороне клиента: всякий раз, когда middleName отсутствует или присутствует, нужно передать func() (bool, string) { return false, nil } внутрь. Это могло бы быть просто (false, nil), если бы Go поддерживала кортежи в качестве входных параметров, но это не так: вы можете вернуть (pairs, or, even, more), но не принимать их как ожидаемые входные данные.

Можно возразить, что nil может быть воспринято как указание на отсутствие. Я не согласен: никакие nil не могут переполнять любую надежную кодовую базу.

Другой вариант я вижу еще более многословным: анонимные структуры вроде func(maybeMiddleName struct{ ok bool; middleName string; }) ..., которые вынуждают вызывающую сторону этого метода каждый раз писать еще больше избыточного кода.

Но я новичок в Go и все еще чувствую, что может быть лучший способ. Есть?


person Sereja Bogolubov    schedule 23.12.2018    source источник
comment
Идиоматическое и короткое решение (которое вы сразу отвергли) состоит в том, чтобы передавать нулевые значения для отсутствующих параметров. Примите нулевое значение. Nil гораздо полезнее в Go, чем в других языках. Вы также можете создать две функции, которые затем вызывают третью, неэкспортируемую функцию (опять же, передавая нулевые значения для неиспользуемых параметров).   -  person Peter    schedule 23.12.2018
comment
@Peter, не могли бы вы опубликовать правильный ответ, демонстрирующий дополнительную силу nil в Go?   -  person Sereja Bogolubov    schedule 23.12.2018
comment
Имейте в виду nil для интерфейсов и срезов, теперь вы никогда не будете уверены, к чему на самом деле приводит проверка == nil. И имейте в виду, что вы не можете создать ни указатель возвращаемого значения на лету, ни string, int или любой другой литерал простого типа, делающий работу с nilable аргументами несколько неуклюжей.   -  person NotX    schedule 27.03.2021


Ответы (1)


Но я новичок в Go и все еще чувствую, что может быть лучший способ. Здесь?

Боюсь сказать нет. Другого пути нет.

person Mostafa Solati    schedule 23.12.2018