GO 接口传值
时间: 2023-10-02 11:06:53 浏览: 53
在 Go 中,接口值是由一个具体类型的值和一个动态类型(也就是这个值的实际类型)组成的。当我们将一个具体类型的值赋值给一个接口变量时,会发生一次隐式的类型转换,将这个值的类型转换为接口变量的动态类型。这个过程被称为接口值的赋值或者接口包装。
当我们将一个接口值传递给函数时,实际上是将这个接口值的副本传递给函数。这个副本包含了原始接口值的动态类型和具体值的副本。因此,当我们在函数内部修改接口值的具体值时,实际上只是修改了这个副本的具体值,原始接口值并不会受到影响。
例如:
```
package main
import "fmt"
type MyInt int
func main() {
var i interface{} = MyInt(5)
fmt.Println(i.(MyInt)) // 输出 5
modify(i)
fmt.Println(i.(MyInt)) // 仍然输出 5,原始接口值并没有被修改
}
func modify(i interface{}) {
i = MyInt(10) // 修改副本的具体值
}
```
在上面的例子中,我们将一个 `MyInt` 类型的值赋值给了一个接口变量 `i`,然后将 `i` 传递给 `modify` 函数。在 `modify` 函数内部,我们将接口值赋值为另一个 `MyInt` 类型的值,但是这个赋值只是修改了副本的具体值,原始接口值并没有被修改,因此最终输出仍然是 `5`。
需要注意的是,当我们将一个接口值传递给函数时,实际上传递的是一个指向底层数据结构的指针,因此在函数内部修改接口值的动态类型是可以生效的,但是这种用法并不常见,也容易引起混淆。