Go语言中如何使用指针传递多类型参数并修改原始值?
go语言中的多类型任意参数指针传递
在go语言中,使用指针传递参数可以让函数修改输入数据的副本,而不会影响原始值。然而,对于多类型参数,如何使用指针进行传递以实现对原始值的修改呢?
问题分析
考虑以下示例代码,它定义了一个objecta结构体,该结构体有一个config配置属性,该属性可以接受字符串或objectb对象。test方法根据参数类型进行处理,但对于字符串类型的参数,它只能修改传递进来的副本,无法影响原始值。
package main import "fmt" type objecta struct { config interface{} } func (objecta) test(param1 interface{}) { switch param1.(type) { case string: param1 = "world" fmt.println("string") case *string: *param1.(*string) = "world" fmt.println("*string") case *objectb: param1.(*objectb).name = "name1" fmt.println("*objectb") case objectb: fmt.println("objectb") } } type objectb struct { name string } func main() { a := objecta{} s := "string" a.test(&s) object := objectb{} a.test(&object) fmt.println(object) fmt.println(s) }
解决方法
在这种情况下,使用接收者参数可以实现对原始值的修改。通过定义一个接受者为*objecta类型的test方法,我们可以直接修改对象a的config属性。
func (o *ObjectA) test(param1 interface{}) { o.Config = param1 switch param1.(type) { case string: param1 = "world" fmt.Println("string") case *string: *param1.(*string) = "world" fmt.Println("*string") case *ObjectB: param1.(*ObjectB).Name = "name1" fmt.Println("*objectB") case ObjectB: fmt.Println("ObjectB") } }
这样,对于字符串类型的参数,将修改传递进来的副本,同时也修改了对象的config属性,从而实现对原始值的修改。
以上就是Go语言中如何使用指针传递多类型参数并修改原始值?的详细内容,更多请关注硕下网其它相关文章!