2015-07-23 2 views
8

В Golang, когда объявлена ​​переменная, она инициализируется нулевым значением, как описано в спецификации.Требуется ли присвоить значение по умолчанию переменной в Голанге?

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

Но это хорошая практика кодирования, чтобы сделать использование этого имущества и явно не инициализировать переменную, если это необходимо инициализировать значение по умолчанию.

, например, в следующем примере

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) 
} 

программа опирается на значение по умолчанию булевы ложными.

+1

Кроме того, если вы запустите golint, это предложит вам убрать дополнительное назначение, потому что оно является значением по умолчанию. Это хороший инструмент для начала работы с стилем Go. – LanceH

ответ

5

Как все говорят, спецификация здесь понятна: вся память инициализирована (обнулена). Вам должен воспользоваться этим, как это делают стандартные пакеты. В частности, это позволяет вам полагаться на «конструктор по умолчанию» для ваших собственных типов и часто пропускать функции New() *T в пользу &T{}.

Многие типы в стандартных пакетах воспользоваться этим, некоторые примеры:

http.Client

Клиент является клиентом HTTP. Его нулевое значение (DefaultClient) - полезный клиент, который использует DefaultTransport.

И тогда вы найдете var DefaultClient = &Client{}, заявленный в пакете.

http.Server

Сервер определяет параметры для запуска сервера HTTP. Значение для Сервера является допустимой конфигурацией.

bytes.Buffer

буфер переменного размера буфер байт с чтением и запись методы. Нулевое значение для буфера - это пустой буфер, готовый к использованию.

Это замечательно, потому что вы можете просто сделать var buf bytes.Buffer и начать использовать его. Вследствие этого вы также часто увидите, что переменные-члены boolean используются в форме «с отрицанием» - например, InsecureSkipVerify в tls.Config не вызывается Verify, так как поведение по умолчанию не будет проверять сертификаты (думаю, я хочу, чтобы false - или нулевое значение, которое будет использоваться для желаемых значений по умолчанию).

Наконец, отвечая на ваш вопрос:

Но это хорошая практика кодирования, чтобы использовать эту собственность и явно не инициализировать переменную, если она должна быть инициализирована значением по умолчанию?

Да, это так.

6

Инициализировать переменные до их нулевых значений, только если вы хотите использовать синтаксис коротких объявлений.

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

В противном случае их инициализация явно является шумом. Вы можете подумать, что что-то не так с неинициализированными переменными ... и вы правы. К счастью, в этом нет такой вещи. Нулевые значения: часть спецификации, и они не собираются внезапно меняться.

2

Когда переменная объявлена ​​она содержит автоматически zero или null значение по умолчанию для его типа: 0 для int, 0.0 для float, false для bool, пустую строку для string, nil для указателя, ноль-эд структура и т.д.

Вся память в Go инициализирована!.

Например: var arr [5]int в памяти можно представить как:

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

При объявлении массива, каждый элемент в нем автоматически инициализируется по умолчанию нулевой стоимости в типа, то здесь все элементы по умолчанию до 0.

Поэтому желательно инициализировать без значения по умолчанию, в других случаях, чем ситуации, когда вы явно хотите объявить переменную со значением по умолчанию.

Смежные вопросы