Требуется ли назначить значение по умолчанию переменной в Golang?

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

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

3 ответов


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

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

протоколу HTTP.Клиент

клиент-это HTTP-клиент. нулевой стоимостью (DefaultClient) - полезный клиент, использующий DefaultTransport.

и var DefaultClient = &Client{} объявлен в пакет.

протоколу HTTP.Сервер

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

байт.Буфер

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

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

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

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

Да, это так.


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

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

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


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

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

например: var arr [5]int в памяти можно визуализировать как:

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

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

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