Size: a a a

2020 April 07

C

Calculon in Go-go!
а кто это
а сократить никак?
Я сокращал как мог
источник

АТ

Александр Толмачёв... in Go-go!
Скорее всего, это не вопрос))
источник

C

Calculon in Go-go!
В общем, ща
источник

АТ

Александр Толмачёв... in Go-go!
А что-то типа ТЗ
источник

а

а кто это in Go-go!
Calculon
Я сокращал как мог
если там код — кидай на пастбин
источник

C

Calculon in Go-go!
Есть методы Foo и Bar, принимаюшие массив Option
func Foo(opts ...Option) {}
func Bar(opts ...Option) {}

Есть набор опций:
func A() Option{}
func B() Option{}
func C() Option{}
func X() Option{}

Проблема в том что есть параметр X, который Foo не поддерживает.
Но из-за того что оба метода принимают Option, в Foo можно прокинуть невалидный аргумент.
func Foo(X()) <- ошибка в рантайме
func Bar(X()) <- все ок

Решить проблему можно сделав для каждого метода свой набор параметров FooOption, BarOption
func Foo(opts ...FooOption) {}
func Bar(opts ...BarOption) {}

Но это приведет к куче бойлерплейта и мешанины в названиях параметров, т.к. большинство параметров для обеих функций одинаковые:
func FooA() FooOption{}
func FooB() FooOption{}
func FooC() FooOption{}

func BarA() BarOption{}
func BarB() BarOption{}
func BarC() BarOption{}
func BarX() BarOption{}


Но зато компилер сможет отловить ошибку:
func Foo(BarX()) <- ошибка в compile time
func Bar(BarX()) <- все ок
What's your choice?
источник

а

а кто это in Go-go!
игнорировать X ¯\_(ツ)_/¯
источник

а

а кто это in Go-go!
а вообще выглядит как неправильный дизайн
источник

C

Calculon in Go-go!
а кто это
а вообще выглядит как неправильный дизайн
Это дизайн API, который писал не я
источник

а

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

DP

Daniel Podolsky in Go-go!
Option - это же интерфейс?

сделайте три типа, универсальный и специализрованные для foo и bar
источник

x

x-foby in Go-go!
дима
Кто-то знает как заставить easyjson маршлить float64 не в экспоненциальном формате?

Сейчас он маршлит так:
"amount": -6.3144465e+06

Хочу так:
"amount": -6314446.50
Как-то так, вроде:

type myFloat64 float64

func (v *myFloat64) MarshalEasyJSON(w *jwriter.Writer) {
 w.RawString(strconv.FormatFloat(float64(v), 'f', -1, 64))
}
источник

а

а кто это in Go-go!
Daniel Podolsky
Option - это же интерфейс?

сделайте три типа, универсальный и специализрованные для foo и bar
я думаю Option это функция
источник

C

Calculon in Go-go!
Option это структура, но могу и в интерфейс переписать
источник

д

дима in Go-go!
x-foby
Как-то так, вроде:

type myFloat64 float64

func (v *myFloat64) MarshalEasyJSON(w *jwriter.Writer) {
 w.RawString(strconv.FormatFloat(float64(v), 'f', -1, 64))
}
спасибо!
источник

C

Calculon in Go-go!
Daniel Podolsky
Option - это же интерфейс?

сделайте три типа, универсальный и специализрованные для foo и bar
https://play.golang.org/p/MfEnasVIgmO
Это работает, но выглядит реально стремно
источник

C

Calculon in Go-go!
Все портит утиная типизация, приходится для Bar-specific интерфейса писать метод-заглушку
источник

DP

Daniel Podolsky in Go-go!
Calculon
Все портит утиная типизация, приходится для Bar-specific интерфейса писать метод-заглушку
Ну да, так и делают
источник

C

Calculon in Go-go!
капец😒
источник

DP

Daniel Podolsky in Go-go!
Как есть
источник