登录
首页 >  Golang >  Go问答

使用引用将不同类型的变量传递给统一可变参数

来源:stackoverflow

时间:2024-02-06 14:36:23 270浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《使用引用将不同类型的变量传递给统一可变参数》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我一直在为 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

编码快乐!

今天关于《使用引用将不同类型的变量传递给统一可变参数》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>