Какое значение по умолчанию для карты структуры - PullRequest
0 голосов
/ 27 августа 2018

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

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 Ответ

0 голосов
/ 27 августа 2018

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

Когда для переменной выделено хранилище, либо через объявление, либо через вызов 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) присваивается значение, хранящееся под ключом«маршрут».Если этот ключ не существует, i является нулевым значением типа значения (0).Второе значение (ok) - это bool, который имеет значение 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)
}

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

...