Valori zero e predefiniti
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 17 di 107.
In Go, ogni variabile ha un valore zero: il valore predefinito assegnato quando dichiari una variabile senza inizializzarla esplicitamente. Comprendere i valori zero è essenziale per lavorare con le struct, poiché i campi non inizializzati ricevono automaticamente questi valori predefiniti.
Ogni tipo ha il proprio valore zero:
| Tipo | Valore zero |
|---|---|
| int, float64 | 0 |
| string | "" (stringa vuota) |
| bool | false |
| pointer, slice, map | nil |
Quando crei una struct, qualsiasi campo che non imposti esplicitamente riceve il suo valore zero.
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (stringa vuota)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}Questo vale anche per l'inizializzazione parziale. Solo i campi che specifichi ricevono valori personalizzati.
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
I valori zero rendono le struct immediatamente utilizzabili senza inizializzazione esplicita. Tuttavia, fai attenzione ai tipi riferimento come slice e map. Il loro valore zero è nil, che può causare panic in fase di esecuzione se provi a usarli senza inizializzarli.
Sfida
FacileCostruiamo un sistema di profili giocatore che dimostra come funzionano i valori zero in Go. Creerai un profilo di gioco in cui alcuni campi sono impostati esplicitamente, mentre gli altri usano i rispettivi valori zero predefiniti.
Organizzerai il codice in due file:
player.go: Definisci una structPlayercon i seguenti campi:Username(string),Level(int),Score(int),IsPremium(bool) eGuildName(string). Crea anche un metodoDisplayProfileche restituisca una stringa formattata con tutte le informazioni del giocatore.main.go: Leggi uno username dall'input e crea un Player usando solo un'inizializzazione parziale: imposta soltanto il campoUsername. Poi visualizza il profilo completo per vedere come Go assegna i valori zero ai campi non impostati.
Verrà fornito il seguente input:
- Riga 1: lo username del giocatore
Il metodo DisplayProfile dovrebbe restituire una stringa in questo formato esatto:
Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]Per esempio, se lo username è ShadowKnight, l'output dovrebbe mostrare lo username insieme a tutti i valori zero dei campi non inizializzati:
Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: Nota che il campo Guild non mostra nulla dopo i due punti: questo è il valore zero della stringa vuota. Questa sfida ti aiuta a vedere esattamente cosa assegna Go a ogni tipo quando non fornisci un valore esplicito.
Provalo tu
package main
import (
"fmt"
)
func main() {
// Leggi il nome utente dall'input
var username string
fmt.Scanln(&username)
// TODO: Crea un Player usando l'inizializzazione parziale
// Imposta solo il campo Username e lascia che gli altri campi usino i valori zero
// TODO: Mostra il profilo del giocatore usando il metodo DisplayProfile
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP in Go
File esterniWorkspace e moduli GoPacchetti e importazioniNomi esportati e non esportatiIntroduzione all’OOP in GoGli struct come classiDefinire metodi sugli structReceiver con puntatore vs receiver con valoreInizializzazione degli structFunzioni costruttriciRiepilogo - Calcolatrice semplice4Interfacce
Introduzione alle interfacceImplementazione implicitaL’interfaccia come contrattoInterfaccia vuota (any)Asserzione di tipoSwitch sul tipoComposizione di interfacceInterfacce Stringer ed ErrorRipasso - Calcolatore di forme7Incapsulamento
Campi esportati e non esportatiIncapsulamento a livello di packageMetodi Getter e SetterNascondimento delle informazioni in GoRiepilogo - Registri degli studenti10Tipi generici (Go 1.18+)
Introduzione ai tipi genericiParametri di tipoVincoli di tipoStruct genericheSoluzione alternativa per i metodi genericiRiepilogo - Collezione generica13Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello Abstract FactoryModello ObserverModello Strategy2Approfondimento su tipi e struct
Tipi di base e compostiDefinizioni di tipi personalizzatiTag delle structStruct anonimeStruct annidateValori zero e predefinitiRipasso - Rubrica5Composizione invece dell'ereditarietà
Perché Go non ha l'ereditarietàFondamenti dell'embedding delle structPromozione dei metodiEmbedding di più structEmbedding e aggregazione a confrontoMascheramento dei metodi embeddedRiepilogo: gerarchia dei dipendenti8Gestione degli errori e OOP
L'interfaccia errorTipi di errore personalizzatiWrapping degli errori (fmt.Errorf)Errori sentinellaerrors.Is() ed errors.As()Panic, Defer e RecoverRiepilogo - Parser di file11Libreria standard e OOP
io.Reader e io.Writersort.InterfaceInterfaccia fmt.Stringerencoding/json con le structInterfaccia http.HandlerRipasso - modelli REST API14Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeMiddleware come Decorator3Puntatori e memoria
Concetti base dei puntatori in GoPuntatori a structPassaggio per valore vs per riferimentoLa funzione new()Garbage collection in GoRiepilogo - Costruttore di liste concatenate6Polimorfismo in Go
Polimorfismo tramite interfacceDuck typing in GoRegole di soddisfacimento delle interfacceCollezioni polimorficheIniezione delle dipendenzeRiepilogo - Elaboratore di pagamenti9Concorrenza e OOP
Basi delle goroutineCanali e comunicazioneCanali bufferizzati vs non bufferizzatiIstruzione selectsync.Mutex e sync.RWMutexsync.WaitGroupProgettazione di struct thread-safeRiepilogo: worker poolEsercitati da solo: Compilatore Go online