Go结构体初始化
为什么 Go 可以同时使用&Personand初始化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
}
回答
p2 := Person{"Ben"}Person通过分配给"Ben"来初始化一个结构体,并将其name分配给p2。p2是值类型Person。
p1 := &Person{"Adam"}Person通过分配给"Adam"来初始化一个结构体name,然后将该结构体的地址分配给p1。p1是指针类型*Person。
Who()是为值类型的接收器定义的方法Person,这意味着该功能始终接收接收实例的副本。当涉及到可变性时,这是一个重要因素。这也适用于指针句柄,例如在您的示例中使用p2,但接收器将继续是实例的本地副本,除非您将接收器定义更改为(p *Person),这将提供指针引用的本地副本。