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

我一直在为golang缺少可选参数而苦苦挣扎,所以我一直在使用最接近的解决方法:可变参数。尽管我让它工作了,但尝试通过引用将多个变量类型传递给同一个可变参数是很麻烦的:


// back-end

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

    for _, v := range variadic {

        if v.(type) == string {

            *v = "New ref val"

        }

    }

}


// front-end

func 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-end

func main() {

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

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

}

...那么我如何更改后端以使所需的前端代码工作?后端可以根据需要尽可能冗长,只要所需的前端按原样运行即可。这可能吗?如果没有,是否有一个优雅的解决方案需要对所需的前端进行最少的更改?


繁华开满天机
浏览 85回答 2
2回答

拉莫斯之舞

用作interface{}参数类型。类型断言指针类型。取消引用指针以设置值。func UpdateRef(variadic ...interface{}) {    for _, v := range variadic {        if v, ok := v.(*string); ok {            *v = "New ref val"        }    }}将指针传递给函数:ref := "Hey"i := 500UpdateRef(&ref, &i)fmt.Println(ref)  // prints “New ref val”

30秒到达战场

你刚才package mainimport (    "reflect")// back-endfunc 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-endfunc 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 。编码快乐!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go