从结构方法字段访问结构字段

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)
}