1. ホーム
  2. go

[解決済み] 構造体のマップのデフォルト値は何ですか?

2022-01-29 06:41:06

質問

マップ内の構造体のデフォルト値は何ですか?mapの値が初期化されていることを確認する方法は?

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{} ?

解決方法は?

構造体のデフォルト値は、型によって異なる各フィールドの値が0です。

<ブロッククオート

変数にストレージが割り当てられたとき、それは 宣言またはnewの呼び出し、または新しい値が作成されたとき、または 複合リテラルまたはmakeの呼び出しで、明示的な 初期化が提供されていない場合、その変数または値にはデフォルトが与えられます。 の値です。このような変数や値の各要素には、ゼロが設定されます。 ブーリアン型はfalse、数値型は0、""。 文字列はnil、ポインタ、関数、インタフェース、スライスは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)になります。2番目の値(ok)は、そのキーがマップに存在する場合はtrue、存在しない場合はfalseとなるboolである。

ご質問の件

<ブロッククオート

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

囲碁のプレイグラウンド