我编写了一个简单的脚本,它将读取/ proc / cpuinfo并返回包含有关内核信息的[]map[string]string
。
问题是我无法使用范围内的值,它总是给我最后一个CPU的信息。
我尝试在任何地方使用闭包,但没有成功。而且我也尝试在循环中本地复制变量,但仍然没有成功。
这是我的代码
func GetCpuInfo() CpuInfo {
cpus, err := os.Open("/proc/cpuinfo")
if err != nil {
log.Fatalln("Cannot open /proc/cpuinfo")
}
defer cpus.Close()
s := bufio.NewScanner(cpus)
cpuCores := make(CpuCores, 0)
core := map[string]string{}
for s.Scan() {
txt := s.Text()
//copying the variable also does not work
core := core
if len(txt) == 0 {
//tried to use closure here with no success
cpuCores = append(cpuCores, core)
continue
}
fields := strings.Split(txt, ":")
if len(fields) < 2 {
continue
}
//using closure here wont work either
var k, v = strings.TrimSpace(fields[0]), strings.TrimSpace(fields[1])
core[k] = v
}
return CpuInfo{
Cores: cpuCores,
CpuCount: uint(runtime.NumCPU()),
Brand: cpuCores[0]["vendor_id"],
Model: cpuCores[0]["model name"],
}
}
从代码中可以看出,似乎没有办法使用这个变量,或者我真的错过了一些重点。
答案 0 :(得分:1)
好像你想做类似的事情:
struct CpuCore {
VendorID string
ModelName string
}
func GetCpuInfo() CpuInfo {
cpus, err := os.Open("/proc/cpuinfo")
if err != nil {
log.Fatalln("Cannot open /proc/cpuinfo")
}
defer cpus.Close()
s := bufio.NewScanner(cpus)
cpuCores := make(CpuCore, 0)
for s.Scan() {
txt := s.Text()
fields := strings.Split(txt, ":")
if len(fields) < 2 {
continue
}
var k, v = strings.TrimSpace(fields[0]), strings.TrimSpace(fields[1])
cpuCores = append(cpuCores, CpuCores{VendorID: k, ModelName: v})
}
return CpuInfo{
Cores: cpuCores,
CpuCount: uint(runtime.NumCPU()),
Brand: cpuCores[0].VendorID,
Model: cpuCores[0].ModelName,
}
}
我假设您有一个结构CpuCore
,并且您想要创建一个名为cpuCores
的数组。
也许如果你包含更多的代码和类型,那么我们就可以尝试运行这段代码。
答案 1 :(得分:0)
我只是在追加核心变量后找到了解决方法
if len(txt) == 0 {
cpuCores = append(cpuCores, core)
core=map[string]string{}
}
像这样,但我不确定这是否会导致内存泄漏
答案 2 :(得分:-1)
//copying the variable also does not work
core := core
在golang中,地图类型是引用类型,我们无法通过:=
复制地图。
你应该在每个循环中制作一个新的地图。