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.