我刚接触过golang,而且刚刚才掌握了它的诀窍。通过Tour of Go,然后加上我自己的理解来使用它。我在Interfaces上,开始用我自己的理解来实现。这是它的链接:Go PlayGround Link。
步骤1:我创建了3种类型:int、struct和接口。
package main
import (
"fmt"
)
type MyInt int
type Pair struct {
n1, n2 int
}
type twoTimeable interface {
result() (int, int)
}
步骤2:然后,我为指针接收器实现了twoTimeable,因为它改变了底层值。
func (p *Pair) result() (int, int) {
p.n1 = 2 * p.n1
p.n2 = 2 * p.n2
return p.n1, p.n2
}
func (m *MyInt) result() (int, int) {
*m = 2 * (*m)
return int(*m), 0
}
步骤3:然后在主函数中声明并分配Myint、结对及其相应的指针。我还声明了两个时间接口。
mtemp := MyInt(2)
var m1 MyInt
var m2 *MyInt
var p1 Pair
var p2 *Pair
m1, m2, p1, p2 = MyInt(1), &mtemp, Pair{3, 4}, &Pair{5, 6}
var tt twoTimeable
fmt.Println(" Values : ", m1, *m2, p1, *p2, tt)
第4步:分配Myint、结对和它们的指针。
tt = m1
fmt.Println(tt.result())
fmt.Printf("Value of m1 %v
", m1)
tt = m2
fmt.Println(tt.result())
fmt.Printf("Value of m2 %v
", *m2)
tt = p1
fmt.Println(tt.result())
fmt.Printf("Value of p1 %v
", p1)
tt = p2
fmt.Println(tt.result())
fmt.Printf("Value of p2 %v
", *p2)
显示的错误:
prog.go:41:5: cannot use m1 (type MyInt) as type twoTimeable in assignment:
MyInt does not implement twoTimeable (result method has pointer receiver)
prog.go:49:5: cannot use p1 (type Pair) as type twoTimeable in assignment:
Pair does not implement twoTimeable (result method has pointer receiver)
我知道M1和p1是不可寻址的,这就是为什么它不能编译。但是,如果我使用p1或m1p1/m1.run()(自动取消FTW),那么方法结果()就可以正常工作了。
在步骤2中,当我将指针接收器更改为值接收者,并将m改为m时(我知道输出的变化):
func (p Pair) result() (int, int) {
p.n1 = 2 * p.n1
p.n2 = 2 * p.n2
return p.n1, p.n2
}
func (m MyInt) result() (int, int) {
m = 2 * (m)
return int(m), 0
}
它就没有显示编译错误了。但是对于m2和p2就不能这样做,因为没有使用Myint和结对来实现结果。当接口方法实现有指针接收时,则不能容纳非指针。
Q1:为什么可以在值接收接口方法(PMyint)的结果()上使用指针(TT=m2),而在指针接收接口方法(PMyint)的结果()上使用值(TT=M1)?
现在让我们恢复到指针接收器。
如果函数接受Param(TTtwoTimeable),那么是否有一种方法,无论TT是类型指针还是非类型指针,我都能够调用tt.Result(),给定的结果()只定义为指针接收器?
看下面的代码:
func doSomething(tt twoTimeable) {
temp1, temp2 := tt.result()
fmt.Print("doing something with ", temp1, temp2)
}
由于TT可以是任何预定义的类型(指针或非指针),因此param似乎不像是一个解决方案,或者我是否依赖于函数的用户来提供指针?如果我不需要更改基础值,例如使用值接收器,那这就不是个问题,因为TT可以保存值或指向该值的指针。
在线等回复。