英文:
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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论