go - 去结构初始化
问题描述
为什么 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
}
解决方案
p2 := Person{"Ben"}
通过分配给初始化一个Person
结构,并将其分配给。是一个值类型。"Ben"
name
p2
p2
Person
p1 := &Person{"Adam"}
通过分配给初始化一个Person
结构,然后将该结构的地址分配给。是指针类型。"Adam"
name
p1
p1
*Person
Who()
是为 value 类型的接收者定义的方法Person
,这意味着该功能始终接收接收实例的副本。当涉及到可变性时,这是一个重要因素。这也适用于指针句柄,例如在您的示例中使用p2
,但接收器将继续是实例的本地副本,除非您将接收器定义更改为(p *Person)
,这将提供指针引用的本地副本。
推荐阅读
- django - 如何将日期从函数记录到日期字段
- dialogflow-es - DialogFlow 中的帐户链接仅发生一次
- esp32 - 在 wifi 监控模式下降低 ESP32 的功耗
- azure - 如何使用 Azure 资源管理器模板获取 Azure Maps 帐户的主键
- php - 使用 AJAX 加载屏幕时无法接收 php echo
- perl - 如何在不知道其键的情况下遍历哈希的嵌套哈希?
- python - 调用 Python 对象时,Python 2.7 中的 Jira 超出了最大递归深度
- spring - ftl @spring.message - 处理 NoSuchMessageException
- php - $_SESSION 变量在设置时总是打印'S'而不是预期的变量
- python - 函数逐字母呈现元素而不是字符串