Go の関数にマップを渡すと、デフォルトでコピーが作成され、コピーへの変更は元のマップには影響しません。元のマップを変更する必要がある場合は、ポインタを介してそれを渡すことができます。空のマップは技術的には nil ポインターであり、空ではないマップを期待する関数に空のマップを渡すとエラーが発生するため、空のマップは慎重に扱う必要があります。
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 ポインターであり、有効なマップではありません。したがって、関数が空ではないマップを予期している場合、空のマップを渡すときにエラーが発生する可能性があります。以上がGolang関数がマップパラメータを受け取る際の注意点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。