首頁 > 後端開發 > Golang > 主體

透過引用改變介面值

王林
發布: 2024-02-13 23:10:09
轉載
848 人瀏覽過

透過引用改變介面值

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
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板