我是GoLang的新手,来自Delphi、C++等领域。我非常兴奋地看到这种语言,并认为它注定成为“下一个大事件”。
我试图理解Go解析器和编译器如何处理指针和引用——似乎找不到任何一处清晰规则的地方。
例如,在下面的代码示例中,返回类型“*list.List”和本地变量“l”是指针类型,并且需要在它们的声明中使用指针符号“*”,但在使用时不必进行取消引用:“l.PushBack(i)”。但是在这段代码中,输入参数“value *int64”被声明为指针,并且必须进行取消引用才能正确使用:“var i int64 = *value / 2”。
我想这是因为“list.List”是引用类型,因此在使用时取消引用是隐含的,而“int64”是值类型,必须像C++中对值类型的任何指针一样处理:必须进行取消引用。
令我困惑的是,即使 “*list.List”必须使用“*”声明为指针类型,但在使用列表实例时,不需要进行取消引用。最初我感到很困惑。这只是“现状”,还是我错过了什么?
我试图理解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
}