从结构方法字段访问结构字段
access to struct field from struct method field
如何从结构方法字段 PrintName 访问结构字段 Name
示例:
type Data struct {
Name string
PrintName func()
}
func main() {
data := Data{
Name: "Name",
PrintName: func() {
fmt.Println(Name)
},
}
data.PrintName()
}
您分配给 Data.PrintName
的函数值与封闭结构没有任何联系,因此在一般情况下它无法访问 Name
字段。
如果你想访问 name 字段,你必须显式传递它,或者使用可以访问 data
结构的闭包,如下所示:
data := Data{
Name: "Name",
}
data.PrintName = func() {
fmt.Println(data.Name)
}
data.PrintName()
这将输出(在 Go Playground 上尝试):
Name
在这个例子中,我们分配给 data.PrintName
字段的函数值是一个 闭包 因为它使用来自封闭块的变量。
您也可以选择将 Data
值显式传递给函数值,但必须修改其签名:
type Data struct {
Name string
PrintName func(d Data)
}
func main() {
data := Data{
Name: "Name",
}
data.PrintName = func(d Data) {
fmt.Println(d.Name)
}
data.PrintName(data)
}
这输出相同,在 Go Playground 上试试这个。
您是否有任何特殊原因希望将 PrintName 作为结构字段而不只是 Data 的方法?
type Data struct {
Name string
}
func (data *Data) PrintName(){
fmt.Println(data.Name)
}
如何从结构方法字段 PrintName 访问结构字段 Name 示例:
type Data struct {
Name string
PrintName func()
}
func main() {
data := Data{
Name: "Name",
PrintName: func() {
fmt.Println(Name)
},
}
data.PrintName()
}
您分配给 Data.PrintName
的函数值与封闭结构没有任何联系,因此在一般情况下它无法访问 Name
字段。
如果你想访问 name 字段,你必须显式传递它,或者使用可以访问 data
结构的闭包,如下所示:
data := Data{
Name: "Name",
}
data.PrintName = func() {
fmt.Println(data.Name)
}
data.PrintName()
这将输出(在 Go Playground 上尝试):
Name
在这个例子中,我们分配给 data.PrintName
字段的函数值是一个 闭包 因为它使用来自封闭块的变量。
您也可以选择将 Data
值显式传递给函数值,但必须修改其签名:
type Data struct {
Name string
PrintName func(d Data)
}
func main() {
data := Data{
Name: "Name",
}
data.PrintName = func(d Data) {
fmt.Println(d.Name)
}
data.PrintName(data)
}
这输出相同,在 Go Playground 上试试这个。
您是否有任何特殊原因希望将 PrintName 作为结构字段而不只是 Data 的方法?
type Data struct {
Name string
}
func (data *Data) PrintName(){
fmt.Println(data.Name)
}