我是GoLang的新手,来自Delphi C ++世界-诚然对这种语言感到非常兴奋,我认为它将成为“下一件大事”。
我正在尝试了解Go解析器和编译器如何处理指针和引用-似乎找不到任何放置一些明确规则的地方。
例如,在下面的代码示例中,返回类型*list.List
和局部变量l
是指针类型,并且*
在其声明中需要使用指针符号,但是在使用时不必取消引用它们:l.PushBack(i)
。但是在同一代码中,输入参数value *int64
被声明为指针,并且必须被取消引用才能正确使用:var i int64 = *value / 2
我认为这是因为list.List
是引用类型,因此使用时,引用是隐式的,而引用是int64
值类型,必须像对待值类型的任何指针一样进行处理,例如在C
++中:必须取消引用。
让我感到困惑的是,即使使用list实例必须*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
}
List
拥有*List
接收者的所有方法:(http://golang.org/pkg/container/list/)
func (l *List) Back() *Element
func (l *List) Front() *Element
func (l *List) Init() *List
...
func (l *List) Remove(e *Element) interface{}
在您的示例l
中,类型为*List
,因此无需取消引用它们。
假设您有这样的事情:
type A struct{}
func (a A) X() {
fmt.Println("X")
}
func (a *A) Y() {
fmt.Println("Y")
}
您可以写:
a := A{}
a.X()
a.Y() // == (&a).Y()
或者,您可以执行以下操作:
a := &A{}
a.X() // same like == (*a).X()
a.Y()
但这仅适用于方法接收器。Go不会自动转换函数参数。鉴于以下功能:
func A(x *int) {
fmt.Println(*x)
}
func B(y int) {
fmt.Println(y)
}
这是无效的:
A(5)
您必须这样做:
var x int
A(&x)
这也是无效的:
var y *int
B(y)
您必须这样做:
B(*y)
与C#或Java不同,当涉及到结构时,Go不会在引用类型和值类型之间进行区分。A *List
是一个指针,a
List
不是。List
仅修改字段会修改本地副本。修改修改后的字段*List
会修改所有“副本”。(因为它们不是副本…它们都指向内存中的同一件事)
有些类型似乎隐藏了基础指针(例如切片包含指向数组的指针),但是Go总是按值传递。
本文向大家介绍C语言取消引用指针,包括了C语言取消引用指针的使用技巧和注意事项,需要的朋友参考一下 示例 要取消引用a_pointer并更改a的值,我们使用以下操作 可以使用以下打印语句对此进行验证。 但是,将一个NULL指针取消引用或其他无效指针将是错误的。这个 通常是未定义的行为。p1可能不会被取消引用,因为它指向的地址0xbad可能不是有效地址。谁知道那里有什么?它可能是操作系统内存,或另一
嗨我有以下方法: 不得不提的是,startDate和endDate是长变量。我尝试在if条件中添加null检查,也尝试使用longValue()方法,但没有结果。你知道我怎样才能解决这个问题吗?可能是fndBugs端的bug?
问题内容: 我最近才刚开始接触Go,我有一个主要的困惑点:我在努力理解何时确切需要显式取消引用指针。 例如,我知道运算符将处理对指针的解引用 在其他哪些情况下会这样做?例如,似乎使用数组。 我在规范中找不到此内容,指针部分很短,甚至没有提到取消引用。对取消引用go的指针的规则进行的任何澄清都将很棒! 问题答案: 所述选择器表达式(例如)这是否: 选择器会 自动取消引用 结构的 指针 。如果是指向结
此代码中可能存在空指针取消引用错误: 如何解决这些问题?
我的应用程序是ARC应用程序,但我仍然在崩溃报告中看到多个崩溃,并显示消息“试图取消引用垃圾指针”。它们很难诊断。 我的问题是,为什么应用程序会因为内存问题而崩溃,即使我们在ARC上,并且我们不能用相同的步骤复制它。如何应对此类碰撞? 其中一份事故报告如下: CrashReporterKey:896d0c8676c0e02eb292865a654825359de4d427硬件模型:iPod4,1版
我是gccgo新手,我需要编译/运行以下代码的帮助(这在“标准”go编译器中可以正常工作(抱歉,我不知道正确的名称)): 我的gcc: 我的第一个文件: 我的第二个文件: 我的编译错误: 我做错了什么?