为了账号安全,请及时绑定邮箱和手机立即绑定

通过引用将不同类型的变量作为参数传递给相同的可变参数

通过引用将不同类型的变量作为参数传递给相同的可变参数

Go
繁华开满天机 2022-12-26 15:40:52
我一直在为golang缺少可选参数而苦苦挣扎,所以我一直在使用最接近的解决方法:可变参数。尽管我让它工作了,但尝试通过引用将多个变量类型传递给同一个可变参数是很麻烦的:// back-endfunc UpdateRef(variadic ...*interface{}) {    for _, v := range variadic {        if v.(type) == string {            *v = "New ref val"        }    }}// front-endfunc Interface(x interface{}) interface{} { return &x }func main() {    ref := Interface("Hey") // starts as "Hey"    i := Interface(500)    UpdateRef(&ref, &i) // ends at "New ref val"}如果我用这个替换前端:// front-endfunc main() {    ref := "Hey" // starts as "Hey"    UpdateRef(ref, 500) // ends at "New ref val"}...那么我如何更改后端以使所需的前端代码工作?后端可以根据需要尽可能冗长,只要所需的前端按原样运行即可。这可能吗?如果没有,是否有一个优雅的解决方案需要对所需的前端进行最少的更改?
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

用作interface{}参数类型。类型断言指针类型。取消引用指针以设置值。


func UpdateRef(variadic ...interface{}) {

    for _, v := range variadic {

        if v, ok := v.(*string); ok {

            *v = "New ref val"

        }

    }

}

将指针传递给函数:


ref := "Hey"

i := 500

UpdateRef(&ref, &i)

fmt.Println(ref)  // prints “New ref val”


查看完整回答
反对 回复 2022-12-26
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

你刚才


package main


import (

    "reflect"

)


// back-end

func UpdateRef(variadic ...interface{}) {

    for _, v := range variadic {

        kind := reflect.TypeOf(v).Kind()

        if kind == reflect.Pointer {

            reflect.ValueOf(v).Elem().Set(reflect.ValueOf("New ref val"))

        }

    }

}


// front-end

func main() {

    ref := "Hey"         // starts as "Hey"

    // To modify a reflection object, the value must be settable.

    UpdateRef(&ref, 500) // ends at "New ref val"

    println(ref)

}


查看 golang 博客:https ://go.dev/blog/laws-of-reflection 。


编码快乐!


查看完整回答
反对 回复 2022-12-26
  • 2 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信