在golang中的字典

kra*_*r65 5 python struct dictionary go

我刚刚开始使用Go,来自Python我试图在Python中找到相当于dict的东西.在Python中我会这样做:

d = {
    'name': 'Kramer',  # string
    'age': 25          # int
}
Run Code Online (Sandbox Code Playgroud)

我第一次发现的map类型,但只允许一个类型的值(它不能同时处理intsstrings.我真的需要创建一个struct每当我想要做这样的事情?或者是有任何类型的我失踪?

欢迎所有提示!

kos*_*tix 10

基本上问题是很难遇到在实际代码中将不同类型的值存储在同一个映射实例中的要求.

在您的特定情况下,您应该只使用结构类型,如下所示:

type person struct {
  name string
  age  int
}
Run Code Online (Sandbox Code Playgroud)

由于所谓的"文字",初始化它们并不比地图更难:

joe := person{
  name: "Doe, John",
  age:  32,
}
Run Code Online (Sandbox Code Playgroud)

访问单个字段并不比使用地图更难:

joe["name"] // a map
Run Code Online (Sandbox Code Playgroud)

joe.name // a struct type
Run Code Online (Sandbox Code Playgroud)

总而言之,请考虑阅读一本关于Go的介绍性书籍 以及解决Go问题的尝试,因为你不可避免地试图将你对动态类型语言的工作知识应用于严格类型的语言,所以你基本上试图在Go中编写Python,这会适得其反.

我建议从 The Go Programming Language开始.

Go上还有免费书籍.

  • 谢谢你!我想我只需要习惯定义我使用的每个结构,而不是像我习惯的所有其他语言(Python/php/js/Ruby)那样动态创建它们。再次感谢您理智的回答,而不是我在这个问题上收到的所有相当恼火的消息..:-) (2认同)

sko*_*kin 7

这可能不是最好的决定,但您可以使用interface{}让您的地图接受任何类型:

package main

import (
    "fmt"
)

func main() {
    dict := map[interface{}]interface{} {
        1: "hello",
        "hey": 2,
    }
    fmt.Println(dict) // map[1:hello hey:2]
}
Run Code Online (Sandbox Code Playgroud)

  • @kramer65 这不是一个好主意,因为尝试使用这样的地图需要付出巨大的努力。类型断言和类型切换丰富。 (6认同)
  • “好吧,如果你真的需要灵活性,那就去做吧!” -> 如果你真的需要灵活性,Go 不是适合这项工作的工具。试试 Python。 (4认同)
  • `arrayOfMaps := make([]map[interface{}]interface{}, 10)` 将创建一个包含 10 个元素的数组。你真的应该参加[golang's tour](https://tour.golang.org) (2认同)