GO 结构体传值给接口,空值了
时间: 2023-12-12 14:02:56 浏览: 76
在 Go 中,结构体类型是值类型。当我们将一个结构体变量赋值给一个接口变量时,实际上传递的是这个结构体变量的副本。如果我们希望在接口变量中保存结构体变量的指针,我们需要将结构体变量的指针强制转换为接口变量的类型。
例如:
```
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "Tom", Age: 18}
var i interface{} = p // 将结构体变量赋值给接口变量
fmt.Println(i) // 输出 {Tom 18}
modify(i)
fmt.Println(i) // 输出 {Tom 18},原始结构体变量并没有被修改
}
func modify(i interface{}) {
p := i.(Person) // 将接口变量转换为结构体变量
p.Name = "Jerry"
p.Age = 20
}
```
在上面的例子中,我们创建了一个 `Person` 结构体变量 `p`,然后将它赋值给一个接口变量 `i`。在函数 `modify` 中,我们将接口变量 `i` 转换为 `Person` 结构体变量,然后修改结构体变量的字段值。但是这个修改只是修改了副本的值,原始结构体变量并没有被修改,因此最终输出结果仍然为 `{Tom 18}`。
需要注意的是,如果我们将一个空结构体变量赋值给接口变量,并试图在接口变量中保存结构体变量的指针,会导致运行时错误。这是因为空结构体变量的内存地址是 nil,无法进行指针转换。因此,在处理空结构体变量时,我们需要特别小心。
例如:
```
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
var p *Person
var i interface{} = p // 将空结构体变量赋值给接口变量
fmt.Println(i) // 输出 <nil>
modify(i)
fmt.Println(i) // 输出 <nil>
}
func modify(i interface{}) {
p := i.(*Person) // 运行时错误:panic: interface conversion: interface {} is nil, not *main.Person
p.Name = "Jerry"
p.Age = 20
}
```
在上面的例子中,我们定义了一个空的 `Person` 结构体指针 `p`,然后将它赋值给一个接口变量 `i`。在函数 `modify` 中,我们试图将接口变量 `i` 转换为 `*Person` 类型的指针,以便进行结构体变量的修改。但是由于 `p` 的值为 nil,试图进行指针转换会导致运行时错误。
阅读全文