Какое значение по умолчанию для карты структуры
Какое значение по умолчанию для структуры на карте? Как проверить, что значение карты инициализировано?
type someStruct struct {
field1 int
field2 string
}
var mapping map[int]someStruct
func main() {
mapping := make(map[int]someStruct)
}
func check(key int) {
if mapping[key] == ? {}
}
Должен ли я проверить против nil
или же someStruct{}
?
1 ответ
Значением по умолчанию для структуры является нулевое значение для каждого поля, которое отличается в зависимости от его типа.
Когда для переменной выделяется хранилище, либо через объявление, либо через вызов new, либо когда создается новое значение, либо через составной литерал, либо через вызов make, и явная инициализация не предоставляется, переменная или значение задаются значение по умолчанию. Каждый элемент такой переменной или значения устанавливается в нулевое значение для его типа: false для логических значений, 0 для числовых типов, "" для строк и nil для указателей, функций, интерфейсов, слайсов, каналов и карт. Эта инициализация выполняется рекурсивно, поэтому, например, каждый элемент массива структур будет обнулять свои поля, если не указано значение.
type T struct { i int; f float64; next *T }
t := new(T)
верно следующее:
t.i == 0
t.f == 0.0
t.next == nil
Но для проверки значения карты на основе ключа, если он существует, вы можете использовать его как:
i, ok := m["route"]
В этом утверждении первому значению (i) присваивается значение, хранящееся под ключом "route". Если этот ключ не существует, i является нулевым значением типа значения (0). Второе значение (ok) является логическим значением, которое имеет значение true, если ключ существует на карте, и значение false, если нет.
На ваш вопрос
Должен ли я проверить на ноль или someStruct{}?
Для проверки инициализированной пустой структуры вы можете проверить someStruct{}
как:
package main
import (
"fmt"
)
type someStruct struct {
field1 int
field2 string
}
var mapping map[int]someStruct
func main() {
var some someStruct
fmt.Println(some == (someStruct{}))
//mapping := make(map[int]someStruct)
}