Follow

Plus je fais du go, plus je trouve qu’il y a une terrachiée de détails qui te pollue la vie…
`Cannot use 'foo' (type map[string][]*url.URL) as type map[string]interface{}`
Les nil qui ne se castent pas correctement en passant en argument
Tout plein de truc qui fait qu’il est rapidement impossible d’arriver à factoriser du code
Et on en arrive au « le plus simple est de dupliquer » 😱

Le truc qui compilote sans aucun souci aussi, mais qui te panic au run avec un joli `interface conversion: interface {} is nil, not map[string]interface {}` 🤦‍♂️

@aeris ben en même temps, si les gens qui font du Rust rigolent bien en voyant ceux qui le comparent à Go, c'est pas uniquement par sectarisme :D

@aeris ben les deux types sont différents donc il proteste, c'est logique. Y a pas de generics, tu peux contourner en faisant de "interface{}" partout mais c'est pas propre.

Après, tu peux caster aussi dans une certaine mesure avec

foo := bar.(<type>)

N'essaie pas Rust toi, tu vas démrimer :)

@Keltounet Wé sauf que les interfaces, c’est pas magique non plus. Jor map[string][]*url.URL qui ne caste pas en map[string]interface{}…

@aeris rien n'est magique en Go, c'est aussi pour ça que ça reste simple.

Souvent, si tu veux utiliser interface{}, c'est que tu dois revoir tes structures de données…

@Keltounet On commence à avoir plusieurs morceaux de config qui se gère pareil (plusieurs contextes possibles, si contextes nommés pas trouvé, on test default, etc). Et refactorer ça, ça ne passe pas cause de []*url.URL qui ne caste pas en interface{}…

@aeris perso, les fichiers de conf c'est du TOML maintenant, YAML est trop chiant.

@Keltounet @aeris Ou que tu veux traiter des trucs qui t'arrivent de l'extérieur (recevoir du JSON en Go n'est pas amusant).

@bortzmeyer @Keltounet J’suis un peu dans ce cas-là aussi. La structure est « globalement » connue, mais certains morceaux sont génériques et connus uniquement des utilisateurs finaux…

@bortzmeyer @Keltounet Là j’ai même des bouts de sandwitch, avec un 1er niveau de structure connues, ensuite un dictionnaire libre de bouts connus. Ou non. 😨

@aeris @Keltounet Là, c'est clair que les langages à structures de données statiques (C, Go, Haskell...) sont désavantagés.

@aeris @Keltounet Et c'est pour ça que Dieu, Turing et Lovelace, dans leur grande sagesse, ont fait en sorte qu'il y ait plusieurs langages de programmation. #paix

@bortzmeyer @Keltounet Wé, sauf que généralement, toi tu n’as le droit qu’à un seul langage pour gérer à peu près tous les cas…

@aeris @Keltounet Ça pourrait être pire, ce langage obligatoire aurait pu être Java.

@bortzmeyer @Keltounet Bizarrement, Java j’aime plutôt. Tu n’es pas autant bloqué qu’en go, même si ce que tu vas faire est un peu moche.
Les génériques y sont 😻 au possible.

@Keltounet @aeris Je précise parce que je n'étais pas clair : « des trucs dont tu ne connais pas la structure »

@bortzmeyer @aeris j'ai bien compris. Tu peux toujours avoir des champs avec le "raw" json aussi.

@bortzmeyer @aeris c'est pas la partie qui me gène le plus franchement, je fais beaucoup ça et j'aime bien la manière de faire de Go.

@aeris @nuvivo_0 les types sont différents. Y a pas de cast auto.

Pour gérer à coup d'interface{} il faut mieux définir des types intermédiaires et c'est plus facilement testable.

@aeris Bof j'aime bien perso, quand je vois le nombre de CVE avec la deserialisation à la java, finalement Go, c'est plus rigide et c'est Bien©®

@aeris @Keltounet ben si tu veux un typage vaguement fort, faut bien passer par ce genre de trucs. En Go c'est assez bien foutu pour ça, si tu compares au C. Évidemment c'est plus lourdaud qu'un langage dynamique, mais tu as des protections supplémentaires, du coup. On n'a rien sans rien. Cela dit je trouver @Keltounet courageux d'avoir programmé ce genre de moulinette en Go plutôt qu'en Ruby ou Python :)

@pb @Keltounet Quand tu vois que play.golang.org/p/05F2q8N5D-- ça passe alors que play.golang.org/p/Rd2TbNjCZ6C ça ne passe pas, tu te poses quand même des questions sur l’état de ce langage…

@aeris @pb sincèrement, le dev qui me pond le premier exemple de code, je le vire.

@Keltounet @pb C’était juste pour l’exemple là, mais tu n’as pas le choix, le 2nd ne passant pas…

@Keltounet @pb Si tu veux réellement réutiliser le code existant (ici la méthode foo), soit tu écris une horreur, soit tu dupliques la méthode… 😭

@aeris @Keltounet ça fait plusieurs mois que j'ai pas touché au Go donc ces subtilités sont un peu loin pour moi, mais je pense que tu as des moyens en général clean de te tirer de ce genre d'affaire.

@pb @aeris et surtout ne pas comparer aux autres langages, surtout ceux OO. La philosophie de Go est complètement *différente*, ne pas appliquer les mêmes raisonnements qu'à Python ou Ruby (ce que j'ai fait au début forcément).

@Keltounet @aeris j'aime bien ce genre de choses quand on apprend un nouveau langage, sentir l'esprit du truc, s'interroger, "mouais il doit y avoir un moyen plus logique de faire ceci".

@pb @aeris moi aussi. Go me fait pas mal réfléchir à la manière de faire les choses, c'est Bien©®

@pb @aeris au début je prototypais en Ruby puis dev en Go et maintenant c'est juste Go direct.

Sign in to participate in the conversation
Mastodon

PARCE QUE C’EST MON INSTANCE !