go - 如何修改结构嵌套数组的值
问题描述
我的结构如下所示:
package main
import (
"fmt"
)
func main() {
s := Stats{}
s.initStructs()
s.Update()
fmt.Println(s)
}
type Stats struct {
Languages []Language
}
type Language struct {
Name string
Mentions int
Frameworks []Framework
}
type Framework struct {
Name string
Mentions int
Sources []string
}
func (s *Stats) Update() {
for _, pl := range s.Languages {
pl.Mentions++
for _, fm := range pl.Frameworks {
fm.Mentions++
}
}
}
func (s *Stats) initStructs() {
techs := map[string][]string{
"python": {"flask", "django", "tensorflow", "pytorch"},
"javascript": {"angular", "typescript", "node", "express", "react", "vue", "socket.io"},
"c#": {"asp.net", "unity", ".net"},
"php": {"laravel"},
"markup": {"html", "css", "scss"},
"java": {"spring", "oracle", "grails", "kotlin", "android"},
"sql": {"postgre", "mongo", "mysql"},
"c++": {"unity"}}
for item := range techs {
planguage := Language{Name: item}
for _, i := range techs[item] {
f := Framework{Name: i}
planguage.Frameworks = append(planguage.Frameworks, f)
}
s.Languages = append(s.Languages, planguage)
}
}
我有一个initStructs()方法让Stats生成看起来像这样的嵌套结构
{[{python 0 [{flask 0 []} {django 0 []} {tensorflow 0 []} {pytorch 0 []}]} {javascript 0 [{angular 0 [....
但是,问题是,每当我尝试使用Update()方法更新嵌套结构的值时,它不起作用,值不会被更新。
我确实意识到我需要使用指针,但不确定如何。
解决方案
当您遍历数组的元素时,循环变量是该元素的副本。因此,您的更新是在副本上完成的,而不是在结构本身上。改用索引:
func (s *Stats) Update() {
for i := range s.Languages {
s.Languages[i].Mentions++
for j := range s.Languages[i].Frameworks {
s.Languages[i].Frameworks[j].Mentions++
}
}
}
推荐阅读
- laravel - Laravel:为每个用户在一行中显示多条数据
- list - 如何操作 List 的 props 和过滤器来获取特定数据?
- javascript - 数组过滤器返回 0 个结果
- sql-server - sp_HelpText 在响应中剥离 dbo 架构的问题
- php - 更改特定语言的徽标
- pywinauto - 如何在不熟悉的桌面应用程序上访问特定窗口和控制器
- angularjs - AngularJS nvd3 图表 - 突出显示一个点
- python - 由 AVX 实现的 Python 的任何 LogSumExp?
- react-native - 如何让我的 React Native Flatlist 重新加载领域数据更新?
- sql-server - 过滤引用中间的特定字符 - TSQL