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

使用指针接收器调用函数的语法

洪宏硕
2023-03-14
问题内容

在Go中,如果我定义了一个以指针作为接收器的函数,那么它不应该只允许从指针调用该html" target="_blank">函数吗?为什么可以从值本身调用此函数并产生相同的效果。

例如,在以下程序中:m1.reset()和m2.reset()具有相同的效果。即使m1是一个值而m2是一个指针。

我有点困惑,因为有 两种方法可以做同一件事, 而且不确定要遵循哪种方法。尽管大多数代码遵循使用指针字段调用函数的 约定 。我想念什么吗?

package main

    import "fmt"

    type MyStruct struct {
        X int
    }

    func (m *MyStruct) reset() {
        m.X = 0
    }

    func main() {
        m1 := MyStruct{1}
        m2 := &MyStruct{1}

        fmt.Println(m1.X)
        fmt.Println(m2.X)

        m1.reset()
        m2.reset()

        fmt.Println(m1.X)
        fmt.Println(m2.X)
    }

问题答案:

规格说:

对应的指针类型 T的方法集是接收者 T或T的所有方法的集(也就是说,它也包含T的方法集)。

关于方法调用的下一条必要信息如下:

x.m()如果x的方法集(类型)包含m并且参数列表可以分配给m的参数列表,则该方法调用有效。如果x是可寻址的并且&x的方法集包含m,x.m()则是x的简写(&x).m()

将以上两个内容放在一起,您将获得所看到的行为。



 类似资料:
  • 我有一个接受字符串的函数。由于 pthread 不接受字符串 ,因此我使函数的参数 char 指针。现在我想用pthread_create调用该函数,但我做不到。问题出现是因为虚空*我认为。我搜索了它并做了一些选角,但我无法成功。我该如何修复它,以便它可以在g下工作 错误是: 线程.cpp: 在函数 “int main()”中: 线程.cpp:27:69: 错误: 从“空 ()(字符)”到“空*

  • 问题内容: 对于我来说,目前尚不清楚,在这种情况下,我想使用值接收器而不是始终使用指针接收器。 回顾一下文档: 该 文档 还说:“对于基本类型,切片和小型结构之类的类型,值接收器非常便宜,因此,除非该方法的语义要求使用指针,否则值接收器是高效且清晰的。” 首先, 它说“非常便宜”,但问题是它比指针接收器便宜。因此,我做了一个小的基准测试(基于要点的代码),向我展示了,即使对于只有一个字符串字段的结

  • 问题内容: 我正在学习接口,类型转换和带有指针接收器的方法。指针接收器方法背后的规则和术语使我感到困惑。让我展示我对一个程序的困惑。 这是我的Go程序。 这是输出。 如果删除最后注释的行,则会出现此错误。 如何修复该行代码,以便能够使用指针接收器调用该方法?请通过提出带有指针接收器的方法的概念来说明解决方案,以阐明为什么它不起作用。 问题答案: 您不能(在这种情况下,对于指针接收器是隐式的)获取表

  • 本文向大家介绍C语言 函数指针(指向函数的指针)详解,包括了C语言 函数指针(指向函数的指针)详解的使用技巧和注意事项,需要的朋友参考一下 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就

  • 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个 指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是 函数指针。 函数指针的定义形式为: returnType (*pointerName)(param list); returnType

  • 问题内容: 尝试在指令的链接函数中使用与号&来调用传递给指令的函数时遇到问题。 似乎在控制器上调用了该函数,但在调用中未传递任何参数。我们看到的所有示例都涉及通过在模板中创建调用来进行传递。有没有一种方法可以从其模板的指令中调用指令中的函数,然后在指令中执行某些操作,以调用传递给它的控制器函数? 问题答案: 您是否在s中传递了参数?例如,在指令的链接函数中,您将希望像这样调用方法: jsfiddl