没有办法使用变量使用范围

时间:2017-03-01 01:06:10

标签: function loops go scope closures

我编写了一个简单的脚本,它将读取/ 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"],
    }
}

从代码中可以看出,似乎没有办法使用这个变量,或者我真的错过了一些重点。

3 个答案:

答案 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中,地图类型是引用类型,我们无法通过:=复制地图。

你应该在每个循环中制作一个新的地图。