Какое значение по умолчанию для карты структуры

Какое значение по умолчанию для структуры на карте? Как проверить, что значение карты инициализировано?

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

Перейти на игровую площадку

Другие вопросы по тегам