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






