0Pricing
Go Academy · Lezione

Metodi sulle struct

Receiver per valore e receiver per puntatore

Metodi sulle struct è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Che cos'è un metodo

Un metodo è una funzione con un argomento receiver. Il receiver si trova tra la parola chiave func e il nome del metodo e associa la funzione a un tipo.

Receiver per valore

Un receiver per valore riceve una copia della struct. Lo utilizzi quando il metodo non deve modificare lo stato:

package main
import "fmt"

type Circle struct{ Radius float64 }

func (c Circle) Area() float64 {
    return 3.14159 * c.Radius * c.Radius
}

func main() {
    c := Circle{Radius: 5}
    fmt.Printf("%.2f\n", c.Area()) // 78.54
}

Receiver tramite puntatore

Un receiver tramite puntatore consente al metodo di modificare la struct. È più efficiente per le struct di grandi dimensioni:

package main
import "fmt"

type Counter struct{ N int }

func (c *Counter) Increment() { c.N++ }
func (c *Counter) Reset()     { c.N = 0 }

func main() {
    c := Counter{}
    c.Increment(); c.Increment()
    fmt.Println(c.N) // 2
    c.Reset()
    fmt.Println(c.N) // 0
}

Quando utilizzare i receiver tramite puntatore

Utilizzi i receiver tramite puntatore quando:

  • Il metodo deve modificare il receiver
  • La struct è grande (si evita la copia)
  • Per coerenza: se un metodo ha un receiver tramite puntatore, dovrebbero averlo tutti

Utilizzi receiver per valore quando la struct è piccola e il metodo legge soltanto i dati.

Espressioni e valori di metodo

I metodi possono essere utilizzati come valori di prima classe:

package main
import "fmt"

type Adder struct{ Base int }

func (a Adder) Add(n int) int { return a.Base + n }

func main() {
    a := Adder{Base: 10}
    fn := a.Add          // method value — bound to a
    fmt.Println(fn(5))   // 15
}

Metodi su tipi non struct

Può definire metodi su qualsiasi tipo denominato nello stesso package, non solo sulle struct:

package main
import "fmt"

type Celsius float64

func (c Celsius) ToFahrenheit() float64 {
    return float64(c)*9/5 + 32
}

func main() {
    t := Celsius(100)
    fmt.Println(t.ToFahrenheit()) // 212
}

Dereferenziazione automatica dei puntatori

Go prende automaticamente l'indirizzo o esegue la dereferenziazione quando chiama i metodi. Non è necessario scrivere manualmente (&c).Method():

package main
import "fmt"

type Box struct{ Val int }

func (b *Box) Double() { b.Val *= 2 }

func main() {
    b := Box{Val: 5}
    b.Double()           // Go auto-takes address
    fmt.Println(b.Val)   // 10
}

Concatenare i metodi

Restituisca il puntatore al receiver per abilitare la concatenazione dei metodi (pattern builder):

package main
import "fmt"

type Builder struct{ result string }

func (b *Builder) Add(s string) *Builder {
    b.result += s
    return b
}
func (b *Builder) Build() string { return b.result }

func main() {
    s := (&Builder{}).Add("Hello").Add(", ").Add("World").Build()
    fmt.Println(s)
}

Metodo String (fmt.Stringer)

Implementi il metodo String() string per controllare come viene stampato un tipo:

package main
import "fmt"

type Point struct{ X, Y int }

func (p Point) String() string {
    return fmt.Sprintf("(%d, %d)", p.X, p.Y)
}

func main() {
    p := Point{3, 4}
    fmt.Println(p) // (3, 4)
}

Receiver tramite puntatore nil

Un metodo con un receiver tramite puntatore può essere chiamato su un puntatore nil, utile per i comportamenti predefiniti:

package main
import "fmt"

type Node struct{ Val int }

func (n *Node) Value() int {
    if n == nil { return 0 }
    return n.Val
}

func main() {
    var n *Node
    fmt.Println(n.Value()) // 0
}

Principio di coerenza

Nella libreria standard di Go e nel Go idiomatico, tutti i metodi di un tipo utilizzano lo stesso tipo di receiver: tutti tramite puntatore o tutti per valore. Mischiarli causa bug difficili da individuare nelle interfacce.

Verifica rapida

Quale tipo di receiver consente a un metodo di modificare i campi della struct?

Riepilogo: metodi

Punti chiave:

  • I metodi hanno un receiver tra func e il nome
  • Receiver per valore: sola lettura, struct piccole
  • Receiver tramite puntatore: modifiche, struct grandi, coerenza
  • Go esegue automaticamente la dereferenziazione: non è necessario scrivere (&v).Method()
  • Implementi String() string per personalizzare la stampa

Traccia per l'esercizio

Definisca una struct BankAccount con un campo Balance float64. Aggiunga i metodi con receiver tramite puntatore Deposit e Withdraw e un metodo con receiver per valore String().

Domande Frequenti

La lezione «Metodi sulle struct» è gratuita?

Sì — il testo completo di «Metodi sulle struct» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «Metodi sulle struct»?

Receiver per valore e receiver per puntatore Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Metodi sulle struct»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Definire e utilizzare le struct
  2. Metodi sulle struct
  3. Modelli per i costruttori
  4. Struct anonime e composizione
← Torna a Go Academy