Golang中关于Map的常见问题解析

Golang中关于Map的常见问题解析 在一次实践练习中,我收到了以下指示:

创建一个映射,其键的类型为字符串,表示人物的"姓_名"格式,值的类型为[]字符串,用于存储他们喜欢的事物。在映射中存储三条记录。打印所有值及其在切片中的索引位置。
bond_jamesShaken, not stirredMartinisWomen
moneypenny_missJames BondLiteratureComputer Science
no_drBeing evilIce creamSunsets

以下是我的实现:
https://play.golang.org/p/wk3fziQomX5

我哪里做错了?


更多关于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/UopgdBH15pJ

这很酷!

使用反引号表示多行字符串。同时使用无类型复合字面量,这样更简洁。

这很有趣。虽然我还需要继续研究,但现在比第一次阅读时理解得更深入了。

fmtPrintln 之间缺少点号(.)。

阅读错误信息可能有助于解决这类问题。

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

此外:

Go语言已经在特定情况下允许省略复合字面量的类型。本提案将这一许可扩展到所有可以推导出字面量类型的场合。

观看了老师的视频后,我得到了以下代码:

package main

import (
	"fmt"
)

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

所以我觉得自己掌握得不错。我只需要再多花点时间研究这个内容。

NobbZ:

阅读错误信息可能有助于解决问题

我在理解某些错误信息方面有困难,但正在逐渐学会解读其他类型的错误。我不明白这个特定的错误信息是什么意思:语句末尾出现意外的 Println

你只需要添加打印切片索引和值的部分

这里有什么问题:https://play.golang.org/p/bfCtHrqFZMx

对于多行字符串请使用反引号。同时建议使用无类型的复合字面量,这样更简洁(参见 https://github.com/golang/go/issues/12854) https://play.golang.org/p/9sgbLZaZjsl

a := {1, 2, 3}这种情况下无法推导出类型,因为它可能是某种长度的int/uint类型。我想这就是为什么在切片字面量中不允许省略类型的原因。

// 代码示例保留原样

这可能是你想要做的。https://play.golang.org/p/UopgdBH15pJ 映射的值是 []string 类型。所以你需要要么当场创建一个列表,要么将其创建为单独的变量然后进行赋值。

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

谢谢 🙂

这部分我不理解:

var x []string = {"a", "b", "c"}
var m map[string]int = {"a": 1}
type T struct {
    V int
}
var s []*T = {{0}, {1}, {2}}
a := {1, 2, 3} // 错误:左侧没有指定类型

在您的代码中,主要问题出现在range循环的使用上。当您使用range遍历map时,第一个返回值是键,第二个返回值是值,而不是索引。您试图将键作为索引使用,这导致了类型不匹配的错误。

以下是修正后的代码:

package main

import "fmt"

func main() {
    m := map[string][]string{
        "bond_james":      {"Shaken, not stirred", "Martinis", "Women"},
        "moneypenny_miss": {"James Bond", "Literature", "Computer Science"},
        "no_dr":           {"Being evil", "Ice cream", "Sunsets"},
    }
    
    for key, values := range m {
        fmt.Printf("Key: %s\n", key)
        for i, value := range values {
            fmt.Printf("  Index: %d, Value: %s\n", i, value)
        }
        fmt.Println()
    }
}

输出结果:

Key: bond_james
  Index: 0, Value: Shaken, not stirred
  Index: 1, Value: Martinis
  Index: 2, Value: Women

Key: moneypenny_miss
  Index: 0, Value: James Bond
  Index: 1, Value: Literature
  Index: 2, Value: Computer Science

Key: no_dr
  Index: 0, Value: Being evil
  Index: 1, Value: Ice cream
  Index: 2, Value: Sunsets

关键修正点:

  1. 外层循环:for key, values := range m - key是字符串键,values是字符串切片
  2. 内层循环:for i, value := range values - i是切片索引,value是切片中的具体值

这样就能正确打印出每个人的喜好及其在切片中的索引位置了。

回到顶部