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
{}
登录后复制登录后复制
游乐场
以上就是通过引用改变接口值的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!