# Introduzione alle Generics in Go - DevFest GDG
Repo con tutti gli esempi e le slides della presentazione.
**Descrizione.** In questo talk introdurremo le generics del Go 1.18 e vedremo alcuni _pattern_ ed _anti-pattern_ del loro utilizzo.
- [Scarica il PDF con le slides](https://github.com/aziis98/talk-intro-go-generics/raw/build/slides.pdf)
## Setup
These slides are made using _Marp_
```bash
$ npm install
```
## Usage
To preview and build the slides use
```bash
# Show slides preview
$ npm run preview
# Build slides
$ npm run build:html
$ npm run build:pdf
```
## Go
There is a Makefile with various utilities for running, build and decompiling the Go examples.
```bash
# Show usage
$ make
# Run/build/decomp examples
$ make run-
$ make compile-
$ make compile-noinline-
$ make decomp-
$ make decomp-noinline-
```
---
# Extra: Per chi non sa cosa sono le interfacce leggere prima questo
```go
type Circle struct {
Radius float64
}
type Rectangle struct {
Width, Height float64
}
type Shape interface {
Area() float64
Perimeter() float64
}
func (c Circle) Area() float64 {
return c.Radius * c.Radius * math.Pi
}
func (c Circle) Perimeter() float64 {
return 2 * c.Radius * math.Pi
}
func (c Circle) Curvature() float64 {
return 1 / c.Radius
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * r.Radius * math.Pi
}
func (r Rectangle) CornerCount() int {
if (r.Width == 0 && r.Height == 0) { return 0 }
if (r.Width == 0 || r.Height == 0) { return 2 }
return 4
}
func AreaOverPerimeter(s Shape) float64 {
return s.Area() / s.Perimeter()
}
// c1 := Circle{ Radius: 5.0 }
c1 := Circle{ 5.0 }
// r1 := Rectangle{ Width: 2.0, Height: 3.0 }
r1 := Rectangle{ 2.0, 3.0 }
AreaOverPerimeter(c1)
AreaOverPerimeter(r1)
```