La funzione new()
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 22 di 107.
Go fornisce una funzione integrata chiamata new() che alloca memoria per un tipo e restituisce un puntatore a esso. La memoria allocata viene inizializzata al valore zero del tipo.
p := new(int) // alloca memoria per un int
fmt.Println(*p) // 0 (valore zero)
fmt.Println(p) // 0xc000018030 (indirizzo di memoria)La funzione new() accetta un tipo come argomento e restituisce un puntatore a un nuovo valore zero allocato di quel tipo. È particolarmente utile quando ti serve un puntatore ma non hai una variabile esistente a cui fare riferimento.
Con le struct, new() crea un puntatore a una struct con tutti i campi impostati sui rispettivi valori zero.
type Person struct {
Name string
Age int
}
p := new(Person)
fmt.Println(p.Name) // "" (cadena vacía)
fmt.Println(p.Age) // 0Potresti chiederti quando usare new() invece dell'operatore di indirizzo &. Entrambi gli approcci seguenti sono equivalenti:
// Using new()
p1 := new(Person)
// Using address operator with literal
p2 := &Person{}La sintassi &Person{} è più comune nella pratica perché ti consente di inizializzare i campi allo stesso tempo. Usa new() quando vuoi specificamente un'istanza con valori zero e preferisci una semantica di allocazione esplicita della memoria.
Sfida
FacileCostruiamo un gestore della configurazione che mostri come new() alloca memoria e inizializza le struct con i rispettivi valori zero. Vedrai in che modo questo approccio differisce dall’uso dell’operatore di indirizzo con un literal di struct.
Organizzerai il codice in due file:
config.go: definisci una structServerConfigcon i campiHost(string),Port(int),MaxConnections(int) eDebugMode(bool). Crea due funzioni:NewServerConfig, che usanew()per allocare unaServerConfige restituisce direttamente il puntatore (con tutti i valori zero)ConfigureServer, che accetta un puntatore*ServerConfiginsieme a una stringa host e a un intero per la porta, poi imposta questi campi nella configurazione tramite il puntatore
Displaysu*ServerConfigche restituisce una stringa formattata con tutti i valori della configurazione.main.go: leggi un host e una porta dall’input. Per prima cosa, crea una configurazione usandoNewServerConfig()e visualizzala per mostrare i valori zero. Poi usaConfigureServerper impostare l’host e la porta e visualizza di nuovo la configurazione per mostrare i valori aggiornati.
Verranno forniti i seguenti input:
- Riga 1: nome host (string)
- Riga 2: numero di porta (intero)
Il metodo Display deve restituire una stringa nel seguente formato esatto:
Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]Stampa l’output della visualizzazione due volte: una prima della configurazione (con i valori zero) e una dopo la configurazione (con l’host e la porta aggiornati).
Per esempio, dati localhost e 8080, l’output dovrebbe essere:
Host:
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: falseNota che la prima visualizzazione mostra tutti i valori zero (stringa vuota, 0, 0, false), perché new() inizializza tutto ai valori zero. Dopo aver chiamato ConfigureServer, cambiano solo l’host e la porta, mentre gli altri campi mantengono i valori zero.
Provalo tu
package main
import (
"fmt"
)
func main() {
// Leggi l'input
var host string
var port int
fmt.Scanln(&host)
fmt.Scanln(&port)
// TODO: Crea una configurazione usando NewServerConfig() e visualizzala
// Questo mostrerà i valori zero
// TODO: Usa ConfigureServer per impostare host e port
// TODO: Visualizza di nuovo la configurazione per mostrare i valori aggiornati
}
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