非指针类型的指针方法

时间:2017-10-26 13:55:33

标签: pointers go methods

根据对此question

的回复
  

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

但实际上我可以对非指针值执行指针方法:

u_2 <- function(x, y){
  x <- deparse(substitute(x))
  y <- deparse(substitute(y))
  tdata$zh[grep(x, tdata$ko, ignore.case = T)] <- y
  tdata
}
u_2(choyo, 加油)

那么,这里有什么问题?这是一个新功能吗?或者对问题的回答是错误的?

1 个答案:

答案 0 :(得分:8)

您正在调用&#34;指针方法&#34;在指针值上。在表达式中:

c.fourWheels()

c的类型为car(非指针);因为car.fourWheels()方法有一个指针接收器,并且因为接收器值是非指针并且是可寻址的,所以它是一个简写:

(&c).fourWheels()

这是Spec: Calls:

  

如果xaddressable&x方法集包含m,则x.m()(&x).m()的简写。< / p>

声明:

  

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

解释如下:

  • 如果你有一个值方法,你可以总是调用它:如果你有一个值,它就可以成为接收者;如果你有一个指针,你总是可以取消引用它以获得准备成为接收者的值。

  • 如果你有一个指针方法,如果只有一个值,可能并不总是来调用它,因为有几个表达式(其结果)不可寻址,并且因此,您将无法获得将用作接收器的指针;这样的例子是函数返回值和映射索引表达式。有关详细信息和示例,请参阅How can I store reference to the result of an operation in Go?;和How to get the pointer of return value from function call?(当然,你总是可以将它分配给一个局部变量并获取它的地址,但那个副本并且指针方法只能修改这个副本而不是原始副本。)