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
登錄后復制
預期:
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 {}
登錄后復制登錄后復制
游樂場