Требуется ли назначить значение по умолчанию переменной в 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-клиент. нулевой стоимостью (DefaultClient) - полезный клиент, использующий DefaultTransport.
и var DefaultClient = &Client{}
объявлен в пакет.
сервер определяет параметры для запуска 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.
поэтому предпочтительно инициализировать без значения по умолчанию, в других случаях, чем ситуации, когда вы явно хотите объявить переменную со значением по умолчанию.