2017-03-01 162 views
0

我已经写了一个简单的脚本,将读取/ 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

为什么你有核心的地图和列表?好像你只追加到cpuCores当TXT == 0否则就把事情的核心地图,在你的返回值只使用cpuCores。 – stderr

回答

0

我刚刚发现的方式围绕通过追加它

if len(txt) == 0 { 
       cpuCores = append(cpuCores, core) 
       core=map[string]string{} 
      } 

这样后复位的核心变量,但我不知道这是否可以导致内存泄漏

-1

//copying the variable also does not work core := core 在golang中,地图类型是参考类型,我们无法通过:=复制地图。

您应该在每个循环中制作一张新地图。

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

我假设你有一个struct CpuCore,并且你想他们的阵列称为cpuCores

也许如果你包含更多的代码和类型,可以让我们真正尝试运行这段代码。

+0

实际上CPU核心是地图containint所有关于单个核心的/ proc/cpuinfo中的数据提供和在我的机器有4个核,所以我想结束了大小为4的地图切片我得到4项,但问题是,他们是最后一个CPU信息只 – nikoss

+0

啊。所以你需要每次通过循环实例化一张新地图。不要在循环外部创建'core',而是在循环中创建它,你应该没问题。现在你正在做的是包含四个引用您保持与最后的值覆盖完全相同的地图列表。 – stderr

+0

这么说,我觉得它是在去使用一个struct这个更地道。 – stderr

相关问题