无法使用使用范围的变量

I have written a simple script that will read the /proc/cpuinfo and return a []map[string]string containing the info about the cores.

The problem is I am unable to use the values inside the range it always gives me the info of the last CPU.

I tried using closures literally everywhere with no success. And also I tried to copy the variables locally in the loop and still no success.

Here is my code

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

As you see from the code seems like there is no way to use this variable or i am really missing some huge point.

I just found the way around by resetting the core variable after appending it

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

like this but I am not sure if this can cause a memory leak

//copying the variable also does not work core := core In golang, map types are reference types and we can not copy a map by :=.

You should make a new map in every loop.

Seems like you want to do something like:

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

I'm assuming you have a struct CpuCore and that you want to make an array of them called cpuCores.

Perhaps if you include more of your code and types that would allow us to actually try to run this code.