Schnittstellenwert durch Referenz ändern

王林
Freigeben: 2024-02-13 23:10:09
nach vorne
849 Leute haben es durchsucht

Schnittstellenwert durch Referenz ändern

php-Editor Baicao ist hier, um Ihnen eine Methode zum Ändern von Schnittstellenwerten durch Referenzen vorzustellen. Beim Programmieren müssen wir manchmal die Parameter einer Funktion oder Methode ändern, möchten aber nicht direkt einen neuen Wert zurückgeben, sondern den ursprünglichen Wert durch eine Referenz ändern. In diesem Fall können wir Referenzparameter verwenden. Durch die Referenzierung von Parametern können wir den Wert der übergebenen Variablen direkt innerhalb der Funktion ändern, ohne einen neuen Wert zurückzugeben. Dieser Ansatz verbessert die Leistung und macht den Code prägnanter und lesbarer. Im nächsten Artikel erklären wir ausführlich, wie Sie Referenzparameter verwenden, um Schnittstellenwerte zu ändern.

Frageninhalt

package main

import (
    "fmt"
)

// -------- library code. can't change ------------
type client struct {
    transport roundtripper
}

type roundtripper interface {
    do()
}

type transport struct{}

func (d transport) do() {}

var defaulttransport roundtripper = transport{}

// -------- my code. can change ------------
func changetransport(r roundtripper) {
    if r == nil {
        fmt.println("transport is nil")
        r = defaulttransport
    }
}

func main() {
    c := client{}
    changetransport(c.transport)
    fmt.println(c.transport)
}
Nach dem Login kopieren

Ausgabe:

transport is nil
<nil>
Nach dem Login kopieren

Erwartet:

transport is nil
{}
Nach dem Login kopieren
Nach dem Login kopieren

Spielplatz

Ich habe dies auch basierend auf https://stackoverflow.com/a/44905592/6740589 versucht:

func changetransport(r roundtripper) {
    if r == nil {
        fmt.println("transport is nil")
        d, ok := defaulttransport.(transport)
        if !ok {
            log.fatal("impossible")
        }

        if t, ok := r.(*transport); ok {
            t = &d
            fmt.println("ignoreme", t)
        } else {
            log.fatal("uff")
        }

    }
}
Nach dem Login kopieren

Ausgabe:

transport is nil
2009/11/10 23:00:00 Uff
Nach dem Login kopieren

Playground

Workaround

Verwenden Sie roundtripper接口的指针作为changetransportFunktionsparameter, um den Wert eines Zeigers zu ändern:

// -------- my code. can change ------------
func changetransport(r *roundtripper) {
    if r != nil && *r == nil {
        fmt.println("transport is nil")
        *r = defaulttransport
    }
}

func main() {
    c := client{}
    changetransport(&c.transport)
    fmt.println(c.transport)
}
Nach dem Login kopieren
transport is nil
{}
Nach dem Login kopieren
Nach dem Login kopieren

Spielplatz

Das obige ist der detaillierte Inhalt vonSchnittstellenwert durch Referenz ändern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
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