首頁  >  文章  >  後端開發  >  透過引用改變介面值

透過引用改變介面值

王林
王林轉載
2024-02-13 23:10:09807瀏覽

透過引用改變介面值

php小編百草在這裡為大家介紹一種透過引用來改變介面值的方法。在程式設計中,有時候我們需要改變一個函數或方法的參數,但是又不希望直接傳回一個新的值,而是希望透過引用的方式修改原來的值。在這種情況下,我們可以使用引用參數來實現。透過引用參數,我們可以直接在函數內部修改傳遞進來的變數的值,而不需要傳回一個新的值。這種方法可以提高效能,並且使程式碼更加簡潔易讀。在接下來的文章中,我們將詳細介紹如何使用引用參數來改變介面值。

問題內容

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

輸出:

transport is nil
<nil>

預期:

transport is nil
{}

遊樂場

我還根據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")
        }

    }
}

輸出:

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

遊樂場

解決方法

使用roundtripper介面的指標作為changetransport函數參數來更改指標的值:

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

遊樂場

以上是透過引用改變介面值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除