GO 结构体传值给指针,空值了
时间: 2023-07-19 07:17:33 浏览: 101
在 Go 中,结构体类型是值类型。当我们将一个结构体变量传递给一个函数时,实际上传递的是这个结构体变量的副本。如果我们希望在函数内部修改原始结构体变量的值,我们可以将这个结构体变量的指针作为函数参数传递。
例如:
```
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "Tom", Age: 18}
fmt.Println(p) // 输出 {Tom 18}
modify(&p)
fmt.Println(p) // 输出 {Jerry 20}
}
func modify(p *Person) {
p.Name = "Jerry"
p.Age = 20
}
```
在上面的例子中,我们定义了一个 `Person` 结构体类型,并创建了一个 `Person` 类型的变量 `p`。然后我们将 `p` 的地址传递给 `modify` 函数,函数内部通过指针修改了原始结构体变量的值,最终输出结果为 `{Jerry 20}`。
需要注意的是,如果我们将一个空结构体变量的指针传递给函数,并试图在函数内部修改它的字段值,会导致运行时错误。这是因为空结构体变量的内存地址是 nil,无法进行字段值的修改。因此,在处理空结构体变量时,我们需要特别小心。
例如:
```
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
var p *Person
fmt.Println(p) // 输出 <nil>
modify(p)
fmt.Println(p) // 输出 <nil>
}
func modify(p *Person) {
p.Name = "Jerry" // 运行时错误:panic: runtime error: invalid memory address or nil pointer dereference
p.Age = 20
}
```
在上面的例子中,我们定义了一个空的 `Person` 结构体指针 `p`,并将其传递给 `modify` 函数。由于 `p` 的值为 nil,试图在函数内部修改它的字段值会导致运行时错误。
阅读全文