Heim > Backend-Entwicklung > Golang > Was ist zu beachten, wenn Golang-Funktionen Kartenparameter empfangen?

Was ist zu beachten, wenn Golang-Funktionen Kartenparameter empfangen?

WBOY
Freigeben: 2024-06-04 10:31:14
Original
438 Leute haben es durchsucht

Beim Übergeben einer Karte an eine Funktion in Go wird standardmäßig eine Kopie erstellt und Änderungen an der Kopie haben keinen Einfluss auf die Originalkarte. Wenn Sie die Originalkarte ändern müssen, können Sie sie über einen Zeiger übergeben. Leere Karten müssen mit Vorsicht behandelt werden, da es sich technisch gesehen um Nullzeiger handelt und die Übergabe einer leeren Karte an eine Funktion, die eine nicht leere Karte erwartet, einen Fehler verursacht.

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

Dinge, die zu beachten sind, wenn die Go-Funktion Kartenparameter empfängt

Bei der Übergabe der Karte an die Funktion als Parameter in Go gibt es einige Vorsichtsmaßnahmen, wenn sie nicht beachtet werden, kann dies zu unerwarteten Ergebnissen führen.

Übergabe von Kopien

Bei der Übergabe einer Karte an eine Funktion wird standardmäßig eine Kopie erstellt. Mit anderen Worten: Die Zuordnung innerhalb der Funktion ist eine Kopie der Parameterzuordnung, und etwaige Änderungen an der Kopie wirken sich nicht auf die Originalzuordnung aus.

Praktischer Fall 1:

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

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

Wie im Beispiel gezeigt, haben die von der Funktion modifyMap an der Karte vorgenommenen Änderungen keinen Einfluss auf die Originalkarte. 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}
}
Nach dem Login kopieren

如示例所示,modifyMap

Vermeiden Sie die Übergabe von Kopien

Wenn Sie die Originalkarte ändern müssen, können Sie sie mit einem Zeiger übergeben. Wenn ein Zeiger übergeben wird, zeigt die Karte innerhalb der Funktion auf die Speicheradresse der ursprünglichen Karte.

Praktischer Fall 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
}
Nach dem Login kopieren
Wie im Beispiel gezeigt, wirken sich die durch die Funktion modifyMap an der Karte vorgenommenen Änderungen auf die Originalkarte aus.

Leere Karte

Seien Sie vorsichtig, wenn Sie einer Funktion eine leere Karte übergeben. Eine leere Karte ist technisch gesehen ein Nullzeiger und keine gültige Karte. Wenn eine Funktion daher eine nicht leere Karte erwartet, kann es bei der Übergabe einer leeren Karte zu einem Fehler kommen.
  • Praktischer Fall 3:
  • rrreee
  • Wie im Beispiel gezeigt, führt die Übergabe einer leeren Karte an die Funktion zu einem Laufzeitfehler. Um dieses Problem zu lösen, können Sie eine Nicht-Null-Prüfung der Karte durchführen oder einen Standardwert angeben.
🎜Fazit: 🎜🎜🎜🎜Bei der Übergabe einer Map an eine Funktion wird standardmäßig eine Kopie erstellt. 🎜🎜Um die Originalkarte zu ändern, können Sie sie mit einem Zeiger übergeben. 🎜🎜Seien Sie vorsichtig mit leeren Karten. 🎜🎜

Das obige ist der detaillierte Inhalt vonWas ist zu beachten, wenn Golang-Funktionen Kartenparameter empfangen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage