Tukar nilai antara muka dengan rujukan

王林
Lepaskan: 2024-02-13 23:10:09
ke hadapan
850 orang telah melayarinya

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)
}
Salin selepas log masuk

Keluaran:

transport is nil
<nil>
Salin selepas log masuk

Dijangka:

transport is nil
{}
Salin selepas log masuk
Salin selepas log masuk

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

    }
}
Salin selepas log masuk

Keluaran:

transport is nil
2009/11/10 23:00:00 Uff
Salin selepas log masuk

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)
}
Salin selepas log masuk
transport is nil
{}
Salin selepas log masuk
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan