通过引用将不同类型的变量作为实参传递给同一个可变形参



我一直在努力解决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"
}

…那么我该如何更改后端以使所需的前端代码工作呢?只要期望的前端按原样运行,后端可以尽可能地冗长。这可能吗?如果没有,是否有一种优雅的解决方案,只需对所需的前端进行最小的更改?

使用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”

你只是

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。

编码快乐!

最新更新