英文:
Interface{} type understanding
问题
无法理解这个问题:
var foo interface{}
foo = make(map[string]int)
fmt.Println(foo) // map[]
但是
foo["one"] = 1
prog.go:10: invalid operation: foo["one"] (类型为 interface {} 的索引)
[进程以非零状态退出]
为什么会这样?
英文:
Can't understand the problem:
var foo interface{}
foo = make(map[string]int)
fmt.Println(foo) // map[]
but
foo["one"] = 1
prog.go:10: invalid operation: foo["one"] (index of type interface {})
[process exited with non-zero status]
Why is that?
答案1
得分: 4
foo
是类型为 interface{}
的变量。它可能包含一个 map,但它仍然是一个接口。
为了进行 map 查找,你首先需要进行类型断言:
foo.(map[string]int)["one"] = 1
关于类型断言的更多信息可以在 Go 规范 中找到:
对于一个类型为 interface 类型 的表达式 x 和一个类型 T,主表达式
x.(T)
断言 x 不是 nil,并且存储在 x 中的值是类型 T。
表达式 x.(T) 被称为 类型断言。
英文:
foo
is of type interface{}
. It might contain a map, but it is still an interface.
In order to do a map lookup, you first need to make a type assertion:
foo.(map[string]int)["one"] = 1
More about type assertion can be found in the Go specifications:
> For an expression x of interface type and a type T, the primary expression
> x.(T)
> asserts that x is not nil and that the value stored in x is of type T.
> The notation x.(T) is called a type assertion.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论