3 回答
TA贡献2019条经验 获得超9个赞
使用 interface{} 表示任何类型,包括指针:
func loadJson(jsonStr []byte, x interface{}) {
json.Unmarshal(jsonStr, x)
}
playground
尽管您可以将 a 分配Configuration给 an interface{},但Configuration值和interface{}值的内存布局是不同的。由于内存布局不同,指向 an 的指针interface{}不能转换为指向 a 的指针Configuration。在同样的道理也适用于[]T和[]interface[}。
在 Go 中用户很少使用指向接口的指针。
关于旁注:您可以使用变量声明和赋值
var config *Configuration
config = new(Configuration)
或者您可以使用简短的变量声明:
config := new(Configuration)
不能同时使用声明和短声明,因为它声明了变量两次。
TA贡献1725条经验 获得超7个赞
interface{} 已经是一个指针了吗?
不,一般来说不是[1]。
这里发生了什么可以让它发挥作用?
考虑以下类型定义:
type Number int
int
并且Number
现在是两种完全不同的类型。您不能使用 a *int
where a*Number
是预期的;即使它们本质上是相同的,甚至在记忆方面也是如此。
规则是相同的*Configuration
和*interface{}
; 即使它们的内存表示是相同的(事实并非如此)。
为什么它在interface{}
那时起作用?因为接口类型是特殊的;它们是 Go 实现多态的方式。如果实现了所述接口,则任何值都可以在接口值中“装箱”。
[1] 在幕后,接口值有时包含一个指针,但这是一个实现细节,与此处无关。
- 3 回答
- 0 关注
- 231 浏览
添加回答
举报