Size: a a a

2020 February 23

RS

Roman Sharkov in Go-go!
https://dave.cheney.net/2020/02/23/the-zen-of-go

> Plan for failure, not success
> Go programmers thinks about the failure case first. We solve the “what if… ” case first. This leads to programs where failures are handled at the point of writing, rather than the point they occur in production.

в таком случае я честно говоря не понимаю почему указатели и особенно интерфейсы в Go могут быть nil 😄

ведь…

func Write(w io.Writer) {
 _, _ = w.Write([]byte(“success”))
}


это как раз тaки the point they occur in production в случае если w == nil // true

Я конечно понимаю что речь о trade-off’е лаконичности кода и его безопасности, но всё-же..
источник

а

а кто это in Go-go!
проблема передающего nil в Write, а не наоборот
источник

RS

Roman Sharkov in Go-go!
а кто это
проблема передающего nil в Write, а не наоборот
увы, автор Write не продумал failure case 😃 программа упадёт. Поэтому “We solve the “what if… ” case first. не совсем верно

ибо Go не язык надёжных соглашений (API) он не мешает пользователю передать nil туда где его не ожидают, так-же как и не даёт автору Write обязать пользователя не передавать nil
источник

а

а кто это in Go-go!
это скорее в  r***, чем в Go
источник

RS

Roman Sharkov in Go-go!
поэтому я бы сказал: We solve the most probable “what if… “ cases first
но кто я чтобы Cheney поправлять))
источник

OK

Oleg Kovalov in Go-go!
Roman Sharkov
https://dave.cheney.net/2020/02/23/the-zen-of-go

> Plan for failure, not success
> Go programmers thinks about the failure case first. We solve the “what if… ” case first. This leads to programs where failures are handled at the point of writing, rather than the point they occur in production.

в таком случае я честно говоря не понимаю почему указатели и особенно интерфейсы в Go могут быть nil 😄

ведь…

func Write(w io.Writer) {
 _, _ = w.Write([]byte(“success”))
}


это как раз тaки the point they occur in production в случае если w == nil // true

Я конечно понимаю что речь о trade-off’е лаконичности кода и его безопасности, но всё-же..
хм...а зачем ты у Write забрал возвращаемое значение error ?
источник

OK

Oleg Kovalov in Go-go!
func Write(w io.Writer) error
источник

RS

Roman Sharkov in Go-go!
Oleg Kovalov
хм...а зачем ты у Write забрал возвращаемое значение error ?
это лишь для примера 🙂

по хорошему код должен был выглядеть так:

var success = []byte(“success”)

func Write(w io.Writer) (int, error) {
 return w.Write(success)
}
источник

OK

Oleg Kovalov in Go-go!
Roman Sharkov
это лишь для примера 🙂

по хорошему код должен был выглядеть так:

var success = []byte(“success”)

func Write(w io.Writer) (int, error) {
 return w.Write(success)
}
по хорошему ваще https://godoc.org/io#WriterTo
источник

OK

Oleg Kovalov in Go-go!
type WriterTo interface {
   WriteTo(w Writer) (n int64, err error)
}
источник

OK

Oleg Kovalov in Go-go!
Roman Sharkov
это лишь для примера 🙂

по хорошему код должен был выглядеть так:

var success = []byte(“success”)

func Write(w io.Writer) (int, error) {
 return w.Write(success)
}
но пример как бы biased раз уж на то пошло
источник

RS

Roman Sharkov in Go-go!
суть не в этом, я скорее про это:

указал Interface, значит имел ввиду не nil

func Example1(x Interface) {
 x.Foo(“bar”)
}

Example1(nil) // Nope, wrong type! compile-time error


хотел nil? будь добр проверяй:

func Example2(x Interface | nil) {
 x.Foo(“bar”) // Nope, a union can’t have a method! compile-time error
}

Example2(nil)


вобщем:

func Example3(x Interface | nil) {
 if x, ok := x.(Interface); ok {
   x.Foo(“bar”)
 } else {
   panic(“How dare you?!”)
 }
}


но… стоит ли оно того в конкретном случае Go это конечно вопрос спорный, наверное нет.. скорее всего нет 🙂
источник

а

а кто это in Go-go!
это как Int?  и Int что ли
источник

а

а кто это in Go-go!
опять эти врапперщики
источник

OK

Oleg Kovalov in Go-go!
Roman Sharkov
суть не в этом, я скорее про это:

указал Interface, значит имел ввиду не nil

func Example1(x Interface) {
 x.Foo(“bar”)
}

Example1(nil) // Nope, wrong type! compile-time error


хотел nil? будь добр проверяй:

func Example2(x Interface | nil) {
 x.Foo(“bar”) // Nope, a union can’t have a method! compile-time error
}

Example2(nil)


вобщем:

func Example3(x Interface | nil) {
 if x, ok := x.(Interface); ok {
   x.Foo(“bar”)
 } else {
   panic(“How dare you?!”)
 }
}


но… стоит ли оно того в конкретном случае Go это конечно вопрос спорный, наверное нет.. скорее всего нет 🙂
итого: все осталось то же самое, ток больше определений.

ну и очевидное - из-за простой тайп-системы этого нет
источник

RS

Roman Sharkov in Go-go!
а кто это
опять эти врапперщики
это как избежание null-pointer deref panic, но этого мы в Go не боимся и я не хочу сказать что нам это обязательно необходимо на уровне языка. Я просто хочу сказать что утверждение “в Go мы сначала продумываем failure path” - не совсем корректное
источник

OK

Oleg Kovalov in Go-go!
Roman Sharkov
это как избежание null-pointer deref panic, но этого мы в Go не боимся и я не хочу сказать что нам это обязательно необходимо на уровне языка. Я просто хочу сказать что утверждение “в Go мы сначала продумываем failure path” - не совсем корректное
nil pointer это не failure path
источник

OK

Oleg Kovalov in Go-go!
вот nil dereference - da ;D
источник

а

а кто это in Go-go!
Roman Sharkov
это как избежание null-pointer deref panic, но этого мы в Go не боимся и я не хочу сказать что нам это обязательно необходимо на уровне языка. Я просто хочу сказать что утверждение “в Go мы сначала продумываем failure path” - не совсем корректное
ну нас как бы носом тыкают в err и это имеется в виду
источник

RS

Roman Sharkov in Go-go!
Oleg Kovalov
nil pointer это не failure path
от хорошей системы типов я бы ожидал, что nil в *T передать было бы нельзя 🙂
если нужен nil тогда *T | nil или сокращённо ?*T

но в Go у нас в первую очередь прагматичность, не безопасность.
источник