首页 > 解决方案 > 去结构初始化

问题描述

为什么 Go 可以同时使用&Person和进行初始化Person

package main

import "fmt"

type Person struct {
    name string
}

func (p Person) Who() string {
    return "Person: " + p.name
}

func main() {
    var p1 = &Person{"Adam"}
    fmt.Println(p1.Who()) // Adam
    var p2 = Person{"Ben"}
    fmt.Println(p2.Who()) // Ben
}

标签: go

解决方案


p2 := Person{"Ben"}通过分配给初始化一个Person结构,并将其分配给。是一个值类型。"Ben"namep2p2Person

p1 := &Person{"Adam"}通过分配给初始化一个Person结构,然后将该结构的地址分配给。是指针类型。"Adam"namep1p1*Person

Who()是为 value 类型的接收者定义的方法Person,这意味着该功能始终接收接收实例的副本。当涉及到可变性时,这是一个重要因素。这也适用于指针句柄,例如在您的示例中使用p2,但接收器将继续是实例的本地副本,除非您将接收器定义更改为(p *Person),这将提供指针引用的本地副本。


推荐阅读