前言
在 Go 中,可以通过传递指针来改变函数外部变量的值,例如:
1 2 3 4 5 6 7 8 9 10 11
| func main() { var a int = 1 fmt.Println(a) change(&a,2) fmt.Println(a) }
func change(a *int, b int) { *a = b }
|
但是在某些情况下,我们可能需要传递interface{}
来接收任意的指针变量,这时候就会遇到一个问题,interface{}
类型声明的变量是不能直接赋值指针的,例如:
1 2 3 4 5 6 7 8 9 10 11
| func main() { var a int = 1 fmt.Println(a) change(&a,2) fmt.Println(a) }
func change(a interface{},b interface{}) { *a = b }
|
解决方案
查阅了一些资料,发现可以通过reflect
包来解决这个问题,最终代码为:
1 2 3 4 5 6 7 8 9 10 11 12
| func main() { var a int = 1 fmt.Println(a) change(&a,2) fmt.Println(a) }
func change(a interface{},b interface{}) { val := reflect.ValueOf(a) val.Elem().Set(reflect.ValueOf(b)) }
|
或者使用新版本范型特性来解决(推荐):
1 2 3 4 5 6 7 8 9 10 11
| func main() { var a int = 1 fmt.Println(a) change[int](&a,2) fmt.Println(a) }
func change[T any](a *T,b T) { *a = b }
|