Maison >développement back-end >Golang >Modifier la valeur de l'interface par référence

Modifier la valeur de l'interface par référence

王林
王林avant
2024-02-13 23:10:09865parcourir

Modifier la valeur de linterface par référence

l'éditeur php Baicao est là pour vous présenter une méthode de modification des valeurs de l'interface via des références. En programmation, nous devons parfois modifier les paramètres d'une fonction ou d'une méthode, mais nous ne voulons pas renvoyer directement une nouvelle valeur, mais modifier la valeur d'origine via une référence. Dans ce cas, nous pouvons utiliser des paramètres de référence. En référençant les paramètres, nous pouvons modifier la valeur de la variable passée directement dans la fonction sans renvoyer une nouvelle valeur. Cette approche améliore les performances et rend le code plus concis et lisible. Dans le prochain article, nous expliquerons en détail comment utiliser les paramètres de référence pour modifier les valeurs de l'interface.

Contenu des questions

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

Sortie :

transport is nil
<nil>

Attendu :

transport is nil
{}

Aire de jeux

J'ai également essayé ceci sur la base de https://stackoverflow.com/a/44905592/6740589 :

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

    }
}

Sortie :

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

Playground

Workaround

Utilisez les roundtripper接口的指针作为changetransportparamètres de fonction pour modifier la valeur d'un pointeur :

// -------- 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
{}

Aire de jeux

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer