Я знаю, что в последней версии 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
и все еще чувствую, что может быть лучший способ. Есть?
nil
для интерфейсов и срезов, теперь вы никогда не будете уверены, к чему на самом деле приводит проверка== nil
. И имейте в виду, что вы не можете создать ни указатель возвращаемого значения на лету, ниstring
,int
или любой другой литерал простого типа, делающий работу сnilable
аргументами несколько неуклюжей. - person NotX   schedule 27.03.2021