Rumah >pembangunan bahagian belakang >Golang >Tukar nilai antara muka dengan rujukan

Tukar nilai antara muka dengan rujukan

王林
王林ke hadapan
2024-02-13 23:10:09864semak imbas

Tukar nilai antara muka dengan rujukan

editor php Baicao ada di sini untuk memperkenalkan kepada anda kaedah menukar nilai antara muka melalui rujukan. Dalam pengaturcaraan, kadangkala kita perlu menukar parameter fungsi atau kaedah, tetapi kita tidak mahu terus mengembalikan nilai baharu, tetapi mahu mengubah suai nilai asal melalui rujukan. Dalam kes ini, kita boleh menggunakan parameter rujukan. Dengan merujuk parameter, kita boleh mengubah suai nilai pembolehubah yang diluluskan terus di dalam fungsi tanpa mengembalikan nilai baharu. Pendekatan ini meningkatkan prestasi dan menjadikan kod lebih ringkas dan boleh dibaca. Dalam artikel seterusnya, kami akan menerangkan secara terperinci cara menggunakan parameter rujukan untuk menukar nilai antara muka.

Isi soalan

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

Keluaran:

transport is nil
<nil>

Dijangka:

transport is nil
{}

Taman permainan

Saya juga mencuba ini berdasarkan 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")
        }

    }
}

Keluaran:

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

Taman Permainan

Penyelesaian

Gunakan roundtripper接口的指针作为changetransportparameter fungsi untuk menukar nilai penunjuk:

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

Taman permainan

Atas ialah kandungan terperinci Tukar nilai antara muka dengan rujukan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam