在golang中分配给map

5
在下面的 Go 代码片段中,我做错了什么?
type Element interface{}

func buncode(in *os.File) (e Element) {
    <snip>
    e = make(map[string]interface{})
    for {
        var k string = buncode(in).(string)
        v := buncode(in)
        e[k] = v
    }
    <snip>
}

编译时出现以下错误:
gopirate.go:38: invalid operation: e[k] (index of type Element)

双字母缩写T和F是什么意思?
1个回答

3
buncode函数中,您声明了一个变量e Element,其中type e Element interface{}。变量e是一个标量值,您试图对其进行索引。
引用: 类型 变量的静态类型(或只是类型)是由其声明定义的类型。接口类型的变量也有不同的动态类型,在运行时存储在变量中的值的实际类型。动态类型可能会在执行过程中发生变化,但始终可以分配给接口变量的静态类型。对于非接口类型,动态类型始终为静态类型。 e的静态类型是标量Elemente的动态类型是map[string]interface{}
这是您代码的修订版本,可编译。
type Element interface{}

func buncode(in *os.File) (e Element) {
    m := make(map[string]interface{})
    for {
        var k string = buncode(in).(string)
        v := buncode(in)
        m[k] = v
    }
    return m
}

为什么要对buncode进行递归调用?

但是我使用make的赋值来设置它的类型?从type assertions的规范中,我了解到该类型现在将是我分配给它的“较大”类型。 - Matt Joiner
递归调用获取m的嵌套值。如果您感兴趣并有一些惯用的go-isms要提出,请在此处查看:http://code.google.com/p/erutor/source/browse/bencoding.py - Matt Joiner
@Matt(1)-编译器不跟踪interface{}值的动态类型,即使它可以静态地知道。您必须使用具有正确类型的单独变量。 - SteveMcQwark
你确定这个代码可以编译吗?你将Element指定为返回值,但是你却返回了一个map。我只是好奇是否有什么我没有注意到的地方。 - milosgajdos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接