Golang中如何将两个切片/数组添加到一个map变量中

Golang中如何将两个切片/数组添加到一个map变量中

var name_age map[string]int

name := []string{"david", "avid", "stitches", "killeta", "sskrill"}
age := []int{20, 30, 18, 40, 34}

如何将切片 name 和 age 插入到 name_age 映射中?

我尝试过:

for _, i := range names {
	for _, x := range x {
		name_age = map[string]int{i: x}
	}
}

也尝试过:

for i := 0; i < len(name); i++ {
	for x := 0; x < len(age); x++ {
		mn = map[string]int{name[i]: age[x]}
	}
}

两个循环的输出都是 map[sskrill:34]

当我使用:

var name_age_x = make(map[string]int)

for i := 0; i < len(name); i++ {
	for x := 0; x < len(age); x++ {
		name_age_x[name[i]] = age[x]
	}
}

输出是 map[avid:34 david:34 killeta:34 sskrill:34 stitches:34] //// 年龄 34 在所有名字中重复出现…… /// 即使我使用 range 循环,结果也是一样的。

如何让它正常工作?

注意:项目的顺序不应被改变/排序,以便年龄与名字匹配。


更多关于Golang中如何将两个切片/数组添加到一个map变量中的实战教程也可以访问 https://www.itying.com/category-94-b0.html

15 回复

谢谢,我已经完成了。

更多关于Golang中如何将两个切片/数组添加到一个map变量中的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


那么这段代码有什么问题呢?

非常感谢。我在这件事上挣扎了超过三个小时。

如果你学会使用单步调试器,那么大约三秒钟内,你就会痛苦地明白你的代码为什么错了、它在做什么以及如何修复它。

了解你的工具是工作中最重要的一部分。步进调试器是最好的调试方式,它们能展示所有事物的状态,你可以像看“慢动作”一样,一步一步地观察事物如何变化。

运行符合预期。谢谢。

能否调整顺序,让所有较长的片段排在前面,较短的排在后面,就像这样:

https://play.golang.org/p/iwXl2n-gIob

请实际操作一下,

var name_age map[string]int

name := []string{"david", "avid", "stitches", "killeta", "sskrill"}
age := []int{20, 30, 18, 40, 34}

这是两个切片,它们的长度是相同的。

假设两个切片长度相同,你可以遍历其中一个切片,并使用索引来同时访问两个切片。

name_age := make(map[string]int)

for idx := range names {
  name_age[name[idx]] = age[idx]
}

运行符合预期。谢谢。

能否调整顺序,让所有较长的块排在前面,较短的块排在后面,就像这样:

https://play.golang.org/p/iwXl2n-gIob

如果能有一种更简单、更易读、更易理解的切片分块方法,将不胜感激。

petrus:

items[m:] 是一个简单的切片表达式。items 变量代表未分配的项目。一旦我们分配了 m 个项目,就更新 items。这会更新 len(items) 的值。

谢谢……现在这让我完全理解了……我一直在想声明 items = items[m:] 的目的是什么。现在我明白了,它是用来更新 len(items) 的值的。

谢谢。我之前完全不知道有单步调试器。我是自学编程的,所以对周围事物的运作方式没有指导。

从 Java 开始,但当我接触到数据库的 CRUD 操作时就放弃了。在网上研究了其他编程语言,尝试了几种,然后爱上了 Golang,因为它简单、数据库连接和设置容易,并且它某种程度上具有面向对象的特性。尽管接收器和 & 符号是新的,并且有点复杂,需要习惯。

类似这样吗?使用 @NobbZ 的代码:

name := []string{"david", "avid", "stitches", "killeta", "sskrill"}
age := []int{20, 30, 18, 40, 34}

name_age := make(map[string]int)

for idx := range name {
 	name_age[name[idx]] = age[idx]
}

fmt.Println(name_age)

https://play.golang.org/p/InYrc39ko2I

非常感谢……真希望你能加上注释,这样我就能理解到底是怎么回事了。我一直对数组和切片相关的东西感到畏惧。

我猜我的脑子就是没法理解它们的工作原理,但假以时日,我最终会明白的。

感谢你的回答,如果你能引导我理解数组的工作原理,以及它们在所有语言中是否都以相同的方式工作,我将不胜感激。

func chunker(items []string, n int) [][]string {
    chunks := make([][]string, n)
    for i := 0; i < len(chunks); i++ {
        m := (len(items) + (n - 1)) / n
        chunks[i] = items[:m]
        items = items[m:]
        n--
    }
    return chunks
}

这看起来更有趣,因为它内部没有 if 条件。

感谢各位提供的解决方案和帮助,我真的从你们那里学到了很多。 现在我想在HTML页面中插入这些数据块,但无法正常工作。 我已经在这里发布了这个问题。

如何在Golang HTML模板中对切片块进行范围遍历 我需要帮助在HTML页面中对数组和切片进行范围遍历。当我尝试遍历数组和块时,它们没有显示在HTML页面中,但标题部分被传递到了HTML页面。 如果这是一个新手问题,请见谅。非常感谢您的帮助。

package main

import (

    "fmt"

    "html/template"

    "log"

    "math/rand"

    "net/http"

    "strconv"

    "time"

    //entities "deadmeat.pro/chunker/src/entities"

    //helpers "deadmeat.pr…

你需要确保两个切片按相同索引对应。使用单个循环,通过索引同时访问两个切片:

package main

import "fmt"

func main() {
    name_age := make(map[string]int)
    
    name := []string{"david", "avid", "stitches", "killeta", "sskrill"}
    age := []int{20, 30, 18, 40, 34}
    
    // 检查长度是否匹配
    if len(name) != len(age) {
        panic("切片长度不匹配")
    }
    
    // 使用单个循环按索引添加
    for i := 0; i < len(name); i++ {
        name_age[name[i]] = age[i]
    }
    
    fmt.Println(name_age)
    // 输出: map[avid:30 david:20 killeta:40 sskrill:34 stitches:18]
}

或者使用range循环:

for i, n := range name {
    name_age[n] = age[i]
}

你之前代码的问题在于使用了嵌套循环,这会导致每个名字都与所有年龄配对,最终只保留最后一次赋值(34)。

回到顶部