【发布时间】:2014-01-17 22:35:38
【问题描述】:
我是 GoLang 的新手,来自 Delphi、C++ 世界 - 无可否认,我对这种语言非常兴奋,我认为它注定会成为“下一件大事”。
我试图了解 Go 解析器和编译器如何处理指针和引用 - 似乎找不到任何明确规则的地方。
例如,在下面的代码示例中,返回类型*list.List 和局部变量l 是指针类型,在它们的声明中需要指针符号*,但它们在使用时不必被取消引用:l.PushBack(i)。但在同一代码中,输入参数value *int64 被声明为指针,必须取消引用才能正确使用:var i int64 = *value / 2
我认为这是因为list.List 是引用类型,所以在使用时取消引用是隐式的,而int64 是值类型,必须像任何指向值类型的指针一样处理,如在 C++ 中示例:它必须被取消引用。
令我困惑的是,即使 *list.List 必须使用 * 声明为指针类型,但在使用列表实例时,不需要取消引用。这让我一开始很困惑。是“就是这样”,还是我错过了什么?
示例:
func GetFactors(value *int64) *list.List {
l := list.New()
l.PushBack(*value)
var i int64 = *value / 2
for ; i > 1; i-- {
if *value%i == 0 {
l.PushBack(i)
}
}
return l
}
【问题讨论】:
-
不,Go 中没有 Java 愚蠢和类型种族主义。相反,当您调用“成员”函数时,会自动取消引用指针。 (这些函数实际上是不合时宜地定义的。)
标签: pointers reference go pass-by-reference