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

指针上定义的方法仍然可以用值调用

柏明亮
2023-03-14
问题内容

“有效的Go”文档说明以下内容。

关于指针与接收器的值的规则是,可以在指针和值上调用值方法,但是只能在指针上调用指针方法。

http://tip.golang.org/doc/effective_go.html#pointers_vs_values

这样,如果我定义如下所示的方法,那么使用值不能调用它吗?

func (self *someStruct) Change(newNum int) {
    self.propertyOne = newNum
}

但是,以下似乎仍然有效。

structInstance := &someStruct{
    propertyOne: 41,
}
(*structInstance).Change(456)

为什么?

是否将值转换(*structInstance)Change调用的地址/指针?

如何确保某个类型的实例不能调用指针上定义的方法(如Change)?

前往游乐场示范

http://play.golang.org/p/azbpp_djlG


问题答案:

根据语言规范:

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

在您的示例中,的方法集中没有Change方法(*structInstance),但是它是可寻址的,并且该方法存在于&(*structInstance)的方法集中,因此该调用被解释为(&(*structInstance)).Change(456)或更简单structInstance.Change(456)

防止此行为的唯一方法是还要在Change上定义方法someStruct,也许会使它感到恐慌。但是,这不是理想的,因为它只会在运行时告诉您有关问题的信息。构造您的程序将不会造成混乱,因此使用此速记实际上并不重要。



 类似资料:
  • 问题内容: 我只是在环游世界中练习51练习。解释声称,该方法在接收到a 而不是指向a的指针时无效。 然而,当我改变声明,以在输出唯一的变化是丢失的标记指针。 那么,即使变量不是指针,为什么还要更改它收到的变量呢? 问题答案: 它不会“接收”值。Go是强类型的,因此如果在某处指定了指向T的指针,则指向T()的指针是唯一可以作为该类型位置的值出现的选项。 “魔术”在编译器中,可以在某些条件下有效地“重

  • 我收到了这个错误:“WebDriverException:消息:'chromedriver'可执行文件需要在路径中。”我能够修复它的唯一方法是手动添加chromedriver的一个位置,如下所示: Chrome启动后,我收到了这个错误:“您使用的是不受支持的命令行标志:--忽略认证错误。稳定性和安全性将受到影响。” 我想尝试使用以下代码来解决这个新错误,但我不知道如何/是否可以将其与手动指定chr

  • 由于上面代码上调用的方法的返回值,我得到了可能的空指针解引用。 有人能让我知道确切的问题和为什么它是一个问题吗? 提前道谢!如果需要其他细节,请告诉我。

  • 我从Sonar那里得到问题:“由于调用方法的返回值,样式-可能的空指针取消引用。findbugs:np_null_on_some_path_from_return_value。问题在lockuntil.after(new Date())上; 我试图用 但它引入了其他问题。 谁能指导一下吗?

  • 问题内容: 我有一个指令,这是代码: 我想呼吁用户采取行动。操作按钮不在指令上。 从控制器呼叫的最佳方法是什么? 问题答案: 如果要使用隔离作用域,则可以使用来自控制器作用域的变量的双向绑定来传递控制对象。您还可以在页面上使用相同的控件对象来控制同一指令的多个实例。

  • 主要内容:定义指针变量,通过指针变量取得数据,关于 * 和 & 的谜题,对星号*的总结数据在内存中的地址也称为 指针,如果一个变量存储了一份数据的指针,我们就称它为 指针变量。 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符串、函数,也可以是另外的一个普通变量或指针变量。 现在假设有一个 char 类型的变量 c,它存储了字符 'K'(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址