golang interface{} 表示值与址

896 阅读1分钟

golang中的interface{}是个“万能类型”,其本身可以表示址(指针)与值,使用时候要清楚是值还是址。

通过interface址修改数据值


func test() {
	var a interface{} = "1"
	var b interface{} = &a

	*b.(*interface{}) = 3
	fmt.Println(a, *b.(*interface{}))
}
//============
3 3

ab 都是interface{}类型,b会指向a的地址,b是一个指针类型的interface{},这个指针指向另一个interface{}, 通过 *b.(*interface{}) = 3 给b指向的地址上的变量进行赋值,因为都指向同个地址,所以a被修改,其中*b表示b地址指向的值,毕竟赋的是值不是地址。

函数参数应用

func main(){
    var a interface{} = "1"
    set(&a)
    fmt.Println(a) //结果为3
}

    
func set(v interface{}) {
    *v.(*interface{}) = 3
}

这种函数是会经常用到的,其实跟上边的例子是一样的,只是这里用函数参数代替了上边例子中的b参数赋值,关键点*v.(*interface{}) = 3

很多时候函数参数明明是interface{},要传进去的参数也是interface{}类型,但是偏偏要带个取值赋&,这就是因为要修改传进去的参数值,函数参数是个地址interface{},函数里边会进行*v.(*interface{})操作。