[已解决]Golang中遍历map时为何无法获取所有值?

[已解决]Golang中遍历map时为何无法获取所有值? 链接

我是Go语言的新手,正在学习一个教程。上面的代码(链接)应该显示一个person结构体的所有值。当我将结构体中的姓氏设置为相同的值时,它似乎停止了,只显示最后一个结构体。如果我将其中一个姓氏的值改为其他任何内容,函数就能正常工作。我不确定我漏掉了什么。 任何帮助都将不胜感激! 谢谢!

func main() {
    fmt.Println("hello world")
}
2 回复

哎呀。问题解决了。我把标识符设成了值,而它们原本就是相同的。

更多关于[已解决]Golang中遍历map时为何无法获取所有值?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,遍历map时无法获取所有值的问题通常是由于map的键(key)被意外覆盖导致的。根据你描述的情况,当结构体中的某个字段(如姓氏)设置为相同值时,遍历map只显示最后一个结构体,这很可能是因为你使用了具有相同值的字段作为map的键,而map的键必须是唯一的。

在你的代码中,如果多个结构体具有相同的键值,后续的赋值会覆盖之前的条目,导致最终map中只保留最后一个结构体。以下是一个示例,演示了这个问题以及如何解决它:

package main

import "fmt"

type Person struct {
    FirstName string
    LastName  string
}

func main() {
    // 创建一个map,键为字符串,值为Person结构体
    people := make(map[string]Person)

    // 添加几个Person结构体到map中,使用LastName作为键
    people["Smith"] = Person{FirstName: "John", LastName: "Smith"}
    people["Smith"] = Person{FirstName: "Jane", LastName: "Smith"} // 这里覆盖了上一个条目
    people["Doe"] = Person{FirstName: "Alice", LastName: "Doe"}

    // 遍历map
    for key, value := range people {
        fmt.Printf("Key: %s, Value: %+v\n", key, value)
    }
    // 输出可能只显示两个条目:一个键为"Smith"(对应Jane Smith),一个键为"Doe"(对应Alice Doe)
    // 因为第一个John Smith被覆盖了
}

要解决这个问题,你需要确保map的键是唯一的。例如,可以使用一个切片来存储所有结构体,或者使用一个组合键(如FirstName + LastName)来避免重复。以下是修改后的示例:

package main

import "fmt"

type Person struct {
    FirstName string
    LastName  string
}

func main() {
    // 使用切片来存储所有Person结构体,避免键覆盖问题
    people := []Person{
        {FirstName: "John", LastName: "Smith"},
        {FirstName: "Jane", LastName: "Smith"},
        {FirstName: "Alice", LastName: "Doe"},
    }

    // 遍历切片
    for _, person := range people {
        fmt.Printf("FirstName: %s, LastName: %s\n", person.FirstName, person.LastName)
    }
    // 输出所有三个结构体,没有覆盖问题
}

或者,如果你必须使用map,可以确保键的唯一性,例如通过组合FirstName和LastName:

package main

import "fmt"

type Person struct {
    FirstName string
    LastName  string
}

func main() {
    people := make(map[string]Person)

    // 使用FirstName + LastName作为键,确保唯一性
    people["JohnSmith"] = Person{FirstName: "John", LastName: "Smith"}
    people["JaneSmith"] = Person{FirstName: "Jane", LastName: "Smith"}
    people["AliceDoe"] = Person{FirstName: "Alice", LastName: "Doe"}

    for key, value := range people {
        fmt.Printf("Key: %s, Value: %+v\n", key, value)
    }
    // 输出所有三个条目,没有覆盖问题
}

在你的具体代码中(根据链接),请检查是否使用了非唯一的值作为map的键,并按照上述方法进行调整。

回到顶部