From 5a3a0bbb7ec8959a2a06856440cf956b3d383d78 Mon Sep 17 00:00:00 2001 From: Antonio De Lucreziis Date: Fri, 3 Mar 2023 23:06:08 +0100 Subject: [PATCH] updated post --- POST.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/POST.md b/POST.md index a6ea0ad..a3d8a4c 100644 --- a/POST.md +++ b/POST.md @@ -285,7 +285,7 @@ o4 := o3.Map(double) // Option[int]{ present: false } Questo sembrerebbe un buon utilizzo delle generics per introdurre il tipo `Option[T]` già molto usato in molti linguaggi funzionali e non. Ad esempio Rust che ha deciso di integrarli direttamente nel linguaggio prima con la macro `try!` e poi con l'operatore `?`. -Al momento però non è possibile introdurre generics nelle funzioni quindi la seguente funzione sarebbe illegale +Vorremmo poter anche scrivere una funzione come la seguente in cui definiamo un metodo su un tipo generico a sua volta con un tipo parametrico ```go func (Option[T]) MapToOther[S any](f func(T) S) Option[s] { @@ -297,6 +297,8 @@ func (Option[T]) MapToOther[S any](f func(T) S) Option[s] { } ``` +Al momento però non è possibile introdurre generics nelle funzioni quindi la seguente funzione sarebbe illegale + Il compilatore del Go per compilare codice con delle generics utilizza una tecnica chiamata **monomorfizzazione** ovvero per ogni utilizzo di una funzione generica, vede quali sono i _type parameter_ utilizzati e specializza quella funzione o tipo al caso particolare. @@ -397,6 +399,8 @@ Ci sono alcuni casi in cui vorremmo implementare una qualche operazione per tipi ## Utilizzi interessanti delle generics +### Accesso type-safe ad un database + Le generics possono essere utilizzate anche solo per rendere il codice più sicuro dal punto di vista dai tipi (e per fare meno conversioni a _runtime_), ad esempio quando definiamo una struct generica nessuno ci obbliga ad utilizzare effettivamente il _type parameter_ che introduciamo. ```go