英文:
Golang Print structure always report undefined
问题
这是我定义的结构 - 通过一个将 JSON 转换为 Go 结构的工具生成:
type NYTimesNews struct {
Data struct {
LegacyCollection struct {
CollectionsPage struct {
Stream struct {
Edges []struct {
Node struct {
FirstPublished string `json:"firstPublished"`
Headline struct {
Default string `json:"default"`
} `json:"headline"`
Summary string `json:"summary"`
URL string `json:"url"`
} `json:"node"`
} `json:"edges"`
} `json:"stream"`
} `json:"collectionsPage"`
} `json:"legacyCollection"`
} `json:"data"`
}
当我在节点层面迭代响应时,一切都正常工作并且可以打印出来,下面是打印出 Edges 数组中的所有节点的代码:
for i, Node := range data.Data.LegacyCollection.CollectionsPage.Stream.Edges {
// fmt.Printf("[%d] \n %s \n", i, Node)
fmt.Printf("[%d] \n %s \n %s\n", i, reflect.TypeOf(Node), Node)
}
输出结果
[0]
struct { Node struct { FirstPublished string "json:\"firstPublished\""; Headline struct { Default string "json:\"default\"" } "json:\"headline\""; Summary string "json:\"summary\""; URL string "json:\"url\"" } "json:\"node\"" }
{{2022-05-14T21:17:13.000Z {Turkey Offers to Evacuate Mariupol Fighters Despite Disagreements} Turkey has had a ship waiting for weeks in Istanbul to evacuate those remaining in the Azovstal steel plant, but Ukraine and Russia have not agreed to a plan, a Turkish official said. https://www.nytimes.com/2022/05/14/world/europe/azovstal-evacuation-turkey.html}}
[1]
struct { Node struct { FirstPublished string "json:\"firstPublished\""; Headline struct { Default string "json:\"default\"" } "json:\"headline\""; Summary string "json:\"summary\""; URL string "json:\"url\"" } "json:\"node\"" }
{{2022-05-14T16:26:03.000Z {Catalan Pop? Corsican Rock? It’s Europe’s Other Song Contest.} The Liet International, a competition for minority and regional languages, lacks the glitz of Eurovision. But its organizers say it helps keep endangered tongues alive. https://www.nytimes.com/2022/05/14/arts/music/minority-languages-song-contest.html}}
但是当我尝试访问 Node 结构中的单个字段时,出现错误。
修改后的代码:
for i, Node := range data.Data.LegacyCollection.CollectionsPage.Stream.Edges {
fmt.Printf("[%d] \n %s \n %s -------- \n\n", i, reflect.TypeOf(Node), Node.FirstPublished)
break
}
输出结果
./getdata-url-nytimes.go:92:80: Node.FirstPublished undefined (type struct{Node struct{FirstPublished string "json:\"firstPublished\""; Headline struct{Default string "json:\"default\"" } "json:\"headline\""; Summary string "json:\"summary\""; URL string "json:\"url\"" } "json:\"node\"" } has no field or method FirstPublished)
在 Go 结构中使用 Node.FirstPublished
打印字段时出现了问题吗?
英文:
Here is the structure I defined - generated from a json to Go struct tool:
type NYTimesNews struct {
Data struct {
LegacyCollection struct {
CollectionsPage struct {
Stream struct {
Edges []struct {
Node struct {
FirstPublished string `json:"firstPublished"`
Headline struct {
Default string `json:"default"`
} `json:"headline"`
Summary string `json:"summary"`
URL string `json:"url"`
} `json:"node"`
} `json:"edges"`
} `json:"stream"`
} `json:"collectionsPage"`
} `json:"legacyCollection"`
} `json:"data"`
}
When I iterate response from my request at the layer of Nodes ,everything works right and can be print out, below are the code of print out all Nodes which is in Edges array
for i, Node:= range data.Data.LegacyCollection.CollectionsPage.Stream.Edges{
// fmt.Printf("[%d] \n %s \n", i, Node)
fmt.Printf("[%d] \n %s \n %s\n", i, reflect.TypeOf(Node),Node)
}
Output
[0]
struct { Node struct { FirstPublished string "json:\"firstPublished\""; Headline struct { Default string "json:\"default\"" } "json:\"headline\""; Summary string "json:\"summary\""; URL string "json:\"url\"" } "json:\"node\"" }
{{2022-05-14T21:17:13.000Z {Turkey Offers to Evacuate Mariupol Fighters Despite Disagreements} Turkey has had a ship waiting for weeks in Istanbul to evacuate those remaining in the Azovstal steel plant, but Ukraine and Russia have not agreed to a plan, a Turkish official said. https://www.nytimes.com/2022/05/14/world/europe/azovstal-evacuation-turkey.html}}
[1]
struct { Node struct { FirstPublished string "json:\"firstPublished\""; Headline struct { Default string "json:\"default\"" } "json:\"headline\""; Summary string "json:\"summary\""; URL string "json:\"url\"" } "json:\"node\"" }
{{2022-05-14T16:26:03.000Z {Catalan Pop? Corsican Rock? It’s Europe’s Other Song Contest.} The Liet International, a competition for minority and regional languages, lacks the glitz of Eurovision. But its organizers say it helps keep endangered tongues alive. https://www.nytimes.com/2022/05/14/arts/music/minority-languages-song-contest.html}}
But when I tried to access single fields in Node structure error occured
Code after modify:
for i, Node:= range data.Data.LegacyCollection.CollectionsPage.Stream.Edges{
fmt.Printf("[%d] \n %s \n %s -------- \n\n", i, reflect.TypeOf(Node), Node.FirstPublished)
break
}
Output
./getdata-url-nytimes.go:92:80: Node.FirstPublished undefined (type struct{Node struct{FirstPublished string "json:"firstPublished""; Headline struct{Default string "json:"default""} "json:"headline""; Summary string "json:"summary""; URL string "json:"url""} "json:"node""} has no field or method FirstPublished)
Anything goes wrong when I use 'doc fieldname' to print a field in a Go structure ?
答案1
得分: 1
你将循环变量命名为Node
,但实际上它包含的是类型为Edge
的结构体。.Node
是你迭代的集合中每个Edge
的属性。你需要通过边的.Node
字段来访问它,像这样:
for i, edge := range data.Data.LegacyCollection.CollectionsPage.Stream.Edges {
fmt.Printf("[%d] \n %s \n %s -------- \n\n", i, reflect.TypeOf(edge.Node), edge.Node.FirstPublished)
break
}
英文:
You named loop variable Node
but what it really contains is a struct of type Edge
. .Node
is property of each Edge
in the collection you iterate over. You need to access it through edge's .Node
field like this instead:
for i, edge:= range data.Data.LegacyCollection.CollectionsPage.Stream.Edges{
fmt.Printf("[%d] \n %s \n %s -------- \n\n", i, reflect.TypeOf(edge.Node), edge.Node.FirstPublished)
break
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论