Size: a a a

2020 May 21

RS

Roman Sharkov in Go-go!
Bohdan Turchyk
а в каком кейсе будет ok == false; p != nil?
такого быть чисто физически не может

если ok == false, тогда и p == nil
источник

RS

Roman Sharkov in Go-go!
snip
Family = nil
не понял
источник

AK

Anton Kucherov in Go-go!
Мне кстати непонятно, почему такие вещи как:
p.Age++
some.Family.Updated = time.Now()

У вас не инкапсулированы и торчат наружу.
источник

BT

Bohdan Turchyk in Go-go!
Roman Sharkov
такого быть чисто физически не может

если ok == false, тогда и p == nil
ну то есть это фактически проверка того, не является ли Father == nil при наличии Family, верно,
источник

RS

Roman Sharkov in Go-go!
Anton Kucherov
Мне кстати непонятно, почему такие вещи как:
p.Age++
some.Family.Updated = time.Now()

У вас не инкапсулированы и торчат наружу.
это пример 🙂
источник

s

snip in Go-go!
Roman Sharkov
не понял
мы на выходе должны получить some.Family.Father с каким то установленным/измененым у него полем
источник

s

snip in Go-go!
но вообще есть смысле в таком операторе, только я не уверен на счет получения зиро вэлью
источник

DP

Daniel Podolsky in Go-go!
Roman Sharkov
@onokonem самое краткое пожалуй это ☝️🏻

код сверху и снизи - эквивалентны, только на данный момент оператор ? существует лишь в моих фантазиях.

? <accessor statement> равен zero-value, false если accessor statement упал бы в segfault, так-же по сути как устроен access к мапе, только универсально распрастраняясь на все nullable типы
да, лямбда-оператор .? - как, например, в groovy - был бы очень кстати

но добавить его довольно сложно, по многим причинам

потому, что в реальности, именно такой код, какой приведен внизу, и должен заменить тот вопросик

а я чем не понимаю, как его сгенерить-то автоматически

BTW, похожую конструкцию генерит protobuf - на каждое поле он делает геттер, и геттер анализирует свой ресивер, и, если он nil - возвращает zero-value
источник

s

snip in Go-go!
возможно какой нибудь ok := assert(some.Family.Father)
источник

RS

Roman Sharkov in Go-go!
Bohdan Turchyk
ну то есть это фактически проверка того, не является ли Father == nil при наличии Family, верно,
смотри, этот код…

if some != nil && some.Family != nil && some.Family.Father != nil {
   some.Family.Father.Age++
   some.Family.Updated = time.Now()
}


и этот код…

if p, ok := ? some.Family.Father; ok && p != nil {
   p.Age++
   some.Family.Updated = time.Now()
}


эквивалентны
источник

AK

Anton Kucherov in Go-go!
Мне воообще кажется длинная цепочка вызовов полей у вложенных структур (и во многих случаев даже методов) является тем над чем нужно задуматься с точки зрения дизайна кода. Если там постоянно появляется в середине Nil, может что то не так с абстракциями? С композицией? Еще с чем?
источник

RS

Roman Sharkov in Go-go!
snip
но вообще есть смысле в таком операторе, только я не уверен на счет получения зиро вэлью
> но вообще есть смысле в таком операторе, только я не уверен на счет получения зиро вэлью

я ориентируюсь исключительно на существующие механизмы и синтаксис в Go.
Как я уже неоднократно упомянал: map работает так-же
источник

BT

Bohdan Turchyk in Go-go!
Roman Sharkov
смотри, этот код…

if some != nil && some.Family != nil && some.Family.Father != nil {
   some.Family.Father.Age++
   some.Family.Updated = time.Now()
}


и этот код…

if p, ok := ? some.Family.Father; ok && p != nil {
   p.Age++
   some.Family.Updated = time.Now()
}


эквивалентны
понял, спасибо
источник

AP

Alexey Palazhchenko in Go-go!
Roman Sharkov
> но вообще есть смысле в таком операторе, только я не уверен на счет получения зиро вэлью

я ориентируюсь исключительно на существующие механизмы и синтаксис в Go.
Как я уже неоднократно упомянал: map работает так-же
Да не так же: foo[«bar»][«baz»] запаникует на [«baz»], если foo[«bar»] – nil
источник

RS

Roman Sharkov in Go-go!
Daniel Podolsky
да, лямбда-оператор .? - как, например, в groovy - был бы очень кстати

но добавить его довольно сложно, по многим причинам

потому, что в реальности, именно такой код, какой приведен внизу, и должен заменить тот вопросик

а я чем не понимаю, как его сгенерить-то автоматически

BTW, похожую конструкцию генерит protobuf - на каждое поле он делает геттер, и геттер анализирует свой ресивер, и, если он nil - возвращает zero-value
> а я чем не понимаю, как его сгенерить-то автоматически

по сути, для pointer / interface ставим if == nil

для map ставим if _, ok := m[k]; !ok

для slice/array ставим if index > len(a)-1
источник

RS

Roman Sharkov in Go-go!
snip
возможно какой нибудь ok := assert(some.Family.Father)
assert what?

assert true?
assert false?
assert nil?
assert exists?
источник

s

snip in Go-go!
Roman Sharkov
assert what?

assert true?
assert false?
assert nil?
assert exists?
это просто первое что в голову пришло, но по факту это ассерт что такой путь существует
источник

DP

Daniel Podolsky in Go-go!
Roman Sharkov
> а я чем не понимаю, как его сгенерить-то автоматически

по сути, для pointer / interface ставим if == nil

для map ставим if _, ok := m[k]; !ok

для slice/array ставим if index > len(a)-1
для начала - нам нужен тип выражения справа. потому, что nil у нас типизованный
источник

RS

Roman Sharkov in Go-go!
Anton Kucherov
Мне воообще кажется длинная цепочка вызовов полей у вложенных структур (и во многих случаев даже методов) является тем над чем нужно задуматься с точки зрения дизайна кода. Если там постоянно появляется в середине Nil, может что то не так с абстракциями? С композицией? Еще с чем?
а мне кажется, что если мы ввели такой синтаксис для map, но не распространяли для nullable, то это косяк языка.

v, ok := ? map[“key”]
v, ok := ? slice[2]
v, ok := ? <-channel
v, ok := ? foo.Bar.Baz
v, ok := ? foo.Bar.Baz[“key”][10].Value
источник

RS

Roman Sharkov in Go-go!
? = try read, return zero-value, false if failed
источник