2015-07-23 26 views
8

In Golang quando una variabile viene dichiarata viene inizializzata con valore zero come descritto nella specifica.È necessario assegnare un valore predefinito alla variabile in Golang?

http://golang.org/ref/spec#The_zero_value

Ma è una buona pratica di codifica a fare uso di questa proprietà e non inizializzare in modo esplicito la variabile se ha bisogno di inizializzato con il valore predefinito.

ad esempio nel seguente esempio

http://play.golang.org/p/Mvh_zwFkOu

package main 

import "fmt" 

type B struct { 
    isInit bool 
    Greeting string 
} 

func (b *B) Init() { 
    b.isInit = true 
    b.Greeting = "Thak you for your time" 
} 

func (b *B) IsInitialized() bool { 
    return b.isInit 
} 

func main() { 
    var b B 
    if !b.IsInitialized(){ 
     b.Init() 
    } 
    fmt.Println(b.Greeting) 
} 

il programma si basa sul valore predefinito di booleano false.

+1

Inoltre, se esegui golint ti suggerirà di abbandonare il compito extra perché è il valore predefinito. È uno strumento utile per iniziare con lo stile di Go. – LanceH

risposta

5

Come tutti dicono, le specifiche sono chiare qui: tutta la memoria è inizializzata (azzerata). Si dovrebbe approfittare di questo come fanno i pacchetti standard. In particolare, consente di fare affidamento su "costruttore predefinito" per i propri tipi e spesso saltare il tipo New() *T a favore di &T{}.

Molti tipi di pacchetti standard approfittare di questo, alcuni esempi:

http.Client

Un client è un client HTTP. Il suo valore zero (DefaultClient) è un client utilizzabile che utilizza DefaultTransport.

E quindi troverai var DefaultClient = &Client{} dichiarato nel pacchetto.

http.Server

Un server definisce i parametri per l'esecuzione di un server HTTP. Il valore zero per Server è una configurazione valida.

bytes.Buffer

Un buffer è un buffer di dimensioni variabili di byte di leggere e scrivere metodi. Il valore zero per Buffer è un buffer vuoto pronto per l'uso.

Questo è ottimo, perché puoi semplicemente fare var buf bytes.Buffer e iniziare a usarlo. Di conseguenza, vedrai spesso le variabili membro booleano da utilizzare in un formato "negato", ad esempio InsecureSkipVerify in tls.Config non è chiamato Verify, perché il comportamento predefinito non convaliderebbe i certificati (penso che io voglia il false - o zero - valore da utilizzare per i valori predefiniti desiderabili).

Infine, rispondendo alla domanda:

Ma è buona prassi di codifica a fare uso di questa proprietà e non inizializzare in modo esplicito la variabile se ha bisogno di essere inizializzato con il valore di default?

Sì, lo è.

6

Inizializza le variabili sui rispettivi valori zero solo se si desidera utilizzare la sintassi di dichiarazione breve.

//less verbose than ''var count int'' 
count := 0 
empty := "" 

Altrimenti, inizializzarli in modo esplicito è solo rumore. Potresti pensare che ci sia qualcosa di sbagliato nelle variabili non inizializzate ... e avresti ragione. Fortunatamente, non c'è niente del genere in circolazione. I valori zero sono parte delle specifiche e non cambieranno improvvisamente.

2

Quando una variabile viene dichiarata contiene automaticamente la zero o null valore di default per il suo tipo: 0 per int, 0.0 per float, false per bool, stringa vuota per string, nil per puntatore, zero ed struct, etc.

Tutta la memoria in Go viene inizializzata!.

Ad esempio: var arr [5]int in memoria può essere visualizzato come:

+---+---+---+---+ | | | | | +---+---+---+---+ 0 1 2 3

Quando si dichiara una matrice, ciascun elemento viene inizializzato automaticamente con il difetto zero valore del tipo, qui tutti gli articoli predefinito a 0.

Quindi, preferibilmente, è preferibile inizializzare senza valore predefinito, in altri casi rispetto alle situazioni in cui si desidera dichiarare esplicitamente una variabile con un valore predefinito.