英文:
There is no way to use variable using range
问题
我已经编写了一个简单的脚本,它将读取/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()
//复制变量也不起作用
core := core
if len(txt) == 0 {
//在这里使用闭包也不起作用
cpuCores = append(cpuCores, core)
continue
}
fields := strings.Split(txt, ":")
if len(fields) < 2 {
continue
}
//在这里使用闭包也不起作用
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"],
}
}
从代码中可以看出,似乎没有办法使用这个变量,或者我确实忽略了一些重要的点。
英文:
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.
答案1
得分: 1
看起来你想做这样的事情:
type CpuCore struct {
VendorID string
ModelName string
}
func GetCpuInfo() CpuInfo {
cpus, err := os.Open("/proc/cpuinfo")
if err != nil {
log.Fatalln("无法打开 /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, CpuCore{VendorID: k, ModelName: v})
}
return CpuInfo{
Cores: cpuCores,
CpuCount: uint(runtime.NumCPU()),
Brand: cpuCores[0].VendorID,
Model: cpuCores[0].ModelName,
}
}
我假设你有一个名为 CpuCore 的结构体,并且你想创建一个名为 cpuCores 的数组。
如果你能提供更多的代码和类型信息,我们或许可以尝试运行这段代码。
英文:
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.
答案2
得分: 0
我刚刚发现了一种方法,通过在追加之后重置核心变量来实现:
if len(txt) == 0 {
cpuCores = append(cpuCores, core)
core=map[string]string{}
}
像这样,但我不确定这是否会导致内存泄漏。
英文:
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
答案3
得分: -1
在Go语言中,map类型是引用类型,我们不能通过:=来复制一个map。
你应该在每次循环中创建一个新的map。
英文:
//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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论