Interface{} type understanding

huangapple go评论79阅读模式
英文:

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.

huangapple
  • 本文由 发表于 2014年1月22日 15:30:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/21276759.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定