ホームページ  >  記事  >  バックエンド開発  >  Golang関数がマップパラメータを受け取る際の注意点

Golang関数がマップパラメータを受け取る際の注意点

WBOY
WBOYオリジナル
2024-06-04 10:31:14395ブラウズ

Go の関数にマップを渡すと、デフォルトでコピーが作成され、コピーへの変更は元のマップには影響しません。元のマップを変更する必要がある場合は、ポインタを介してそれを渡すことができます。空のマップは技術的には nil ポインターであり、空ではないマップを期待する関数に空のマップを渡すとエラーが発生するため、空のマップは慎重に扱う必要があります。

Golang 函数接收 map 参数时的注意事项

Go関数がmapパラメータを受け取る際の注意点

Goでは、mapをパラメータとして関数に渡す際にいくつかの注意点がありますので、注意しないと予期せぬ結果を招く可能性があります。

コピーの受け渡し

マップを関数に渡すと、デフォルトでコピーが作成されます。つまり、関数内のマップはパラメーター マップのコピーであり、コピーを変更しても元のマップには影響しません。

実際的なケース 1:

func modifyMap(m map[string]int) {
    m["key"] = 100
}

func main() {
    m := make(map[string]int)
    modifyMap(m)
    fmt.Println(m) // 输出:{}
}

例に示すように、modifyMap 関数によってマップに加えられた変更は、元のマップには影響しません。 modifyMap 函数对 map 做出的修改不会影响原始 map。

避免副本传递

如果需要修改原始 map,可以使用指针来传递。当传递指针时,函数内的 map 指向原始 map 的内存地址。

实战案例 2:

func modifyMap(m *map[string]int) {
    (*m)["key"] = 100
}

func main() {
    m := make(map[string]int)
    modifyMap(&m)
    fmt.Println(m) // 输出:{key: 100}
}

如示例所示,modifyMap

コピーの受け渡しを避ける

元のマップを変更する必要がある場合は、ポインターを使用してそれを渡すことができます。ポインタが渡されると、関数内のマップは元のマップのメモリ アドレスを指します。

実践的なケース 2:

func printMap(m map[string]int) {
    for k, v := range m {
        fmt.Println(k, v)
    }
}

func main() {
    var m map[string]int // 空 map
    printMap(m) // 运行时错误:panic: runtime error: invalid memory address or nil pointer dereference
}

この例に示すように、modifyMap 関数によってマップに加えられた変更は、元のマップに影響します。

空のマップ

空のマップを関数に渡すときは注意してください。空のマップは技術的には nil ポインターであり、有効なマップではありません。したがって、関数が空ではないマップを予期している場合、空のマップを渡すときにエラーが発生する可能性があります。
  • 実際的なケース 3:
  • rrreee
  • 例に示すように、空のマップを関数に渡すと実行時エラーが発生します。この問題を解決するには、マップ上で非 null チェックを実行するか、デフォルト値を指定します。
🎜結論: 🎜🎜🎜🎜マップを関数に渡すと、デフォルトでコピーが作成されます。 🎜🎜元のマップを変更するには、ポインターを使用してそれを渡すことができます。 🎜🎜空の地図には注意してください。 🎜🎜

以上がGolang関数がマップパラメータを受け取る際の注意点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。