当前位置: 首页 > 面试题库 >

定位指针,引用,取消引用的规则:

陈刚洁
2023-03-14
问题内容

我是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: 我的第一个文件: 我的第二个文件: 我的编译错误: 我做错了什么?