Size: a a a

2020 May 21

D

Darwin in Go-go!
Roman Sharkov
эх, хотелось бы порой видеть вместо

func GetMuz(f *Foo) *Muz {
   if f != nil && f.Bar != nil && f.Bar.Baz != nil {
       return f.Bar.Baz.Muz
   }
   return nil
}

нечто похожее на

func GetMuz(f *Foo) *Muz {
   return ? f.Bar.Baz.Muz
}

func HasMuz(f *Foo) {
   if v, ok := ? f.Bar.Baz.Muz; ok && v != nil {
       fmt.Println("has muz")
       return
   }
   fmt.Println("no muz")
}

типа оператор, выражение которого равно zero-value в случае если выражение доступа к полю повалилось бы в segfault.
эх, в руби это классно реализованно
источник

RS

Roman Sharkov in Go-go!
Andrey Privalov
я так и сказал - оно похоже
ничерта не похоже. Тернарный оператор это видоизменённый if statement. А я говорю про оператор, который пытается прочитать значение из любого accessor’a и прежде чем валиться в segfault возвращает zero-value, и ok bool если мы его задекларировали
источник

AP

Andrey Privalov in Go-go!
ну ок, не похоже
источник

AP

Andrey Privalov in Go-go!
хотя я не могу сходу придумать, зачем бы zero value структуры получать. она ж развестая может быть. мне кажется, лучше явно ее определять, если надо
источник

AP

Andrey Privalov in Go-go!
опять же, часто для структур пишем типа New() *S чтобы всякие map инициализировать и тд
источник

D

Darwin in Go-go!
чтоб нил поинтер дереференс не случился
источник

D

Darwin in Go-go!
и не писать портянку из ифов проверяя каждое поле
источник

AP

Andrey Privalov in Go-go!
ну это вечный спор, наравне в if err ...
источник

RS

Roman Sharkov in Go-go!
Andrey Privalov
хотя я не могу сходу придумать, зачем бы zero value структуры получать. она ж развестая может быть. мне кажется, лучше явно ее определять, если надо
f.Foo.Bar.Baz.Muz.Fuzz упадёт с nil-pointer dereference если Baz == nil // true

поэтому приходится писать

if f != nil && f.Bar != nil && f.Bar.Baz != nil && f.Bar.Baz.Muz != nil {
 return f.Bar.Baz.Muz.Fuzz
}


а можно бы было просто

return ? f.Bar.Baz.Muz.Fuzz
источник

AP

Andrey Privalov in Go-go!
я бы так не писал, как в твоем примере
источник

D

Darwin in Go-go!
вот в руби f&.Bar&.Baz&.Muz&.Fuzz
источник

АП

Александр Попов... in Go-go!
дробовики с защитой от выстрела в ногу не производим :)
источник

AP

Andrey Privalov in Go-go!
я бы как-то так делал
if f == nil {
   return
}

if f.Baz == nil {
   return
}

...
источник

AP

Andrey Privalov in Go-go!
чтобы можно было и логгировать еслинадо, и разные ошибки вернуть, если надо
источник

AP

Andrey Privalov in Go-go!
и нагляднее получается, как мне кажется
источник

RS

Roman Sharkov in Go-go!
Andrey Privalov
я бы так не писал, как в твоем примере
а как?
источник

AP

Andrey Privalov in Go-go!
выше пример
источник

S

Shade in Go-go!
Andrey Privalov
и нагляднее получается, как мне кажется
Некоторые просто не умеют жить без паравозов
источник

AP

Andrey Privalov in Go-go!
возможно
источник

AK

Anton Kucherov in Go-go!
А зачем обычно может понадобится такая функция как описаная выше:
GetMuz(f *Foo) *Muz
Есть более приближенные к жизни примеры?
источник