Heim  >  Artikel  >  Backend-Entwicklung  >  Schnittstellenwert durch Referenz ändern

Schnittstellenwert durch Referenz ändern

王林
王林nach vorne
2024-02-13 23:10:09808Durchsuche

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

Ausgabe:

transport is nil
<nil>

Erwartet:

transport is nil
{}

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")
        }

    }
}

Ausgabe:

transport is nil
2009/11/10 23:00:00 Uff

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)
}
transport is nil
{}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen