这个问题没有我想的那么清楚,我会问一个更好的问题。但是我不想在此标记重复。因此,我已提出自己的问题。如果可以,可以将其删除以免混淆社区。请只做那些需要的。当您在这里时,请不要对我投反对票。抱歉,不清楚
我是golang的新手,刚掌握了它。
我正在学习环游,然后以自己的理解来使用它。
我当时在Interfaces并开始以自己的理解实施。
这是Go PlayGround链接
步骤1:我将3种类型设置为一个int,一个结构和一个接口
步骤2:然后我为指针接收器实现twoTimeable,因为它更改了基础值。
步骤3:然后,我在main函数中声明并分配了MyInt,Pair及其对应的指针。我还声明了twoTimeable接口
步骤4:我分配了MyInt,Pair及其指针(称为实现的方法)并打印出来。
它显示错误:
我也读了这个问题,我知道m1和p1无法寻址,这就是为什么它不能编译。
但是如果我使用p1或m1
现在在步骤2中,当我将指针接收器更改为值接收器,并将* m更改为m(我知道Output的更改)
它突然不显示编译错误。不适用于m2和p2,因为现在没有使用* MyInt和* Pair实现结果的实现
这意味着如果接口方法实现具有值接收器tt可以容纳指针和值。
但是,当接口方法实现具有指针接收器时,它将无法保存非指针。
Q1 : Why it is fine to use pointers (tt = m2) on value receiver interface methods(p MyInt) result() , but not values (tt = m1) on pointer receiver interface method(p *MyInt) result().
现在让我们回到指针接收器。
Is there a way that if function accept param (tt twoTimeable) i will be able to invoke tt.result() irrespective tt being a pointer to type or not, given result() is only definded with pointer receiver.
请参见下面的代码:
由于tt可以是任何预定义的类型(指针或不是指针),因此支持参数(tt * twoTimeable,如果我什至可以做到)似乎不是解决方案,或者我是否依赖函数的用户来提供指针。如果我不必更改基础值,即使用值接收器,这不是问题,因为tt可以保存值或指向该值的指针
我总是接受答案。
Is there a way that if function accept param (tt twoTimeable) i will be able to invoke tt.result() irrespective tt being a pointer to type or not, given result() is only definded with pointer receiver.
这似乎是一个主要的误解。如果
具体类型(例如,您的MyInt)对类型为twoInterfaces的变量的可分配性问题是另一个问题。如果您的具体类型(例如MyInt)恰好具有由接口类型(此处为twoTimetables)定义的所有方法,则它是可分配的,如果不能,则不能分配。
问题"我的具体类型有什么方法"是第三个问题。这是唯一一个有点复杂的问题。在接收者T上定义的任何方法都是T的方法。对于指针类型* T,* T上的方法和T计数上的方法。
Q1 : Why it is fine to use pointers on value receiver methods but not vice vers?
因为语言规范说得很好:https://golang.org/ref/spec#Method_sets:
The method set of the corresponding pointer type *T is the set of all methods declared with receiver *T or T (that is, it also contains the method set of T).
(规格之所以可能是这样的:方便。)
对于其余的问题:我丝毫不知道你在问什么。
(关于"指向接口的指针"部分:是的。从技术上讲,可以执行
Shouldn't it for m2 and p2, because now there is no implementation of result using *MyInt and *Pair
否。您正在混淆不同的事物,并曲解了结果。
在大多数情况下,Go可让您省略指针取消引用。
看到最后一行?
该取消引用将自动插入(它是C中
您的m2和p2只是包含指针的变量。如果需要,这些指针将被取消引用。这与指针/值接收器或接口无关。