“有效的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
方法集包含m
,x.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 的内存(地址