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

huangapple go评论105阅读模式
英文:

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(data.Name)
        },
    }

    data.PrintName()
}

在上述示例中,我们定义了一个名为Data的结构体,它包含一个Name字段和一个PrintName方法字段。在main函数中,我们创建了一个data实例,并为Name字段赋值为"Name"。PrintName方法是一个匿名函数,它打印出data.Name的值。最后,我们调用data.PrintName()来执行该方法,从而打印出Name字段的值。

英文:

How I can access struct field Name from struct method field PrintName
example:

type Data struct {
	Name      string
	PrintName func()
}

func main() {
	data := Data{
		Name: "Name",
		PrintName: func() {
			fmt.Println(Name)
		},
	}

	data.PrintName()
}

答案1

得分: 1

你分配给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上尝试一下。

英文:

The function value you assign to Data.PrintName has no connection to the enclosing struct whatsoever, so in the general case it can't access the Name field.

If you want to access the name field, you have to pass it explicitly, or use a closure that can access the data struct like this:

data := Data{
	Name: "Name",
}

data.PrintName = func() {
	fmt.Println(data.Name)
}

data.PrintName()

This will output (try it on the Go Playground):

Name

In this example the function value we assign to data.PrintName field is a closure because it uses a variable from the enclosing block.

You can also choose to pass the Data value explicitly to the function value, but then its signature must be modified:

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

This outputs the same, try this one on the Go Playground.

答案2

得分: 1

你想将PrintName作为结构字段而不仅仅是Data的一个方法,有什么特殊的原因吗?

type Data struct {
    Name string
}
func (data *Data) PrintName(){
    fmt.Println(data.Name)
}
英文:

Is there any particular reason you want PrintName as a struct field instead of just a method of Data?

type Data struct {
    Name string
}
func (data *Data) PrintName(){
    fmt.Println(data.Name)
}

huangapple
  • 本文由 发表于 2022年4月16日 20:51:38
  • 转载请务必保留本文链接:https://go.coder-hub.com/71894029.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定