Struct anonime
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 15 di 107.
Una struct anonima è una struct senza un tipo con nome. Ne definisci la struttura e crei un'istanza in un unico passaggio, senza usare la parola chiave type.
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}Questo crea direttamente un valore struct senza dichiarare un tipo riutilizzabile. Le struct anonime sono utili quando hai bisogno di una struttura dati rapida e occasionale che non verrà usata altrove nel tuo codice.
Un caso d'uso comune consiste nel raggruppare dati correlati per una singola funzione o un singolo test.
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhostLe struct anonime sono molto usate anche nei test basati su tabelle, in cui ogni caso di test ha campi unici.
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}Poiché le struct anonime non hanno un nome di tipo, non puoi definirvi metodi né riutilizzare il tipo altrove. Usale per raggruppare dati temporanei e circoscritti. Per tutto ciò a cui farai riferimento più volte, definisci invece un tipo struct con nome.
Sfida
FacileCostruiamo un rapido sistema di configurazione che mostri quando le struct anonime sono ideali: per raggruppare dati una tantum che non richiedono un tipo riutilizzabile.
Organizzerai il codice in due file:
config.go: crea una funzione chiamataGetServerConfigche accetta come parametri il nome di un server (string), la porta (int) e la modalità di debug (bool). Questa funzione deve restituire una struct anonima contenente questi tre valori come campi:Name,PorteDebug. Poiché questa configurazione viene usata in un solo punto, non è necessario definire un tipo con nome.main.go: leggi i valori di configurazione del server dall'input, chiama la funzioneGetServerConfige visualizza i dettagli della configurazione.
Verranno forniti i seguenti input:
- Riga 1: nome del server
- Riga 2: numero di porta
- Riga 3: modalità di debug (
trueofalse)
Formato dell'output:
Server: [Name]
Port: [Port]
Debug: [Debug]Per esempio, dati api-server, 8080 e true, l'output dovrebbe essere:
Server: api-server
Port: 8080
Debug: trueNota come la struct anonima ti consenta di restituire dati raggruppati senza appesantire il codice con un tipo utilizzato una sola volta.
Provalo tu
package main
import (
"fmt"
)
func main() {
// Leggi i valori di input
var name string
var port int
var debug bool
fmt.Scanln(&name)
fmt.Scanln(&port)
fmt.Scanln(&debug)
// TODO: Chiama GetServerConfig con i valori di input
// e memorizza la struct anonima restituita
// TODO: Stampa la configurazione nel formato richiesto:
// Server: [Name]
// Port: [Port]
// Debug: [Debug]
}
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