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
funce 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() stringper 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
- Definire e utilizzare le struct
- Metodi sulle struct
- Modelli per i costruttori
- Struct anonime e composizione