对于Golang语言实现接口的方法,我们可以绑定到结构体的地址,或者结构体上
type User struct{
Name string
Sex int
}
func (u User) GetName () {
//绑定到结构体上
}
func (u *User) GetSex () {
//绑定到结构体地址上
}
但是,我们在使用结构体方法时,通过接口进行对数据的断言,将断言后的数据进行调用结构体的方法,此时,如果方法绑定的是结构体的地址,就会报错
func main() {
var a Integer = 1
var b Integer = 1
sum := a.Add(b)
fmt.Println(sum)
var i interface{} = a
sum = i.(Integer).Add(b) // 报错
fmt.Println(sum)
}
type Integer int
func (a *Integer) Add(b Integer) Integer {
return *a + b
}
Cannot call pointer method on 'i.(Integer)'
先说原因:如果方法绑定到结构体的地址上,就会根据结构体的变量地址进行调用方法,但是,通过断言返回的是一个值,并不是一个变量,无法拿到这个值的地址,所以会报错。
知道出错的原因之后,我们可以将代码进行重新编写,也就是在断言之后返回一个值,让变量去接收这个值,然后再进行调用方法。
func main() {
var a Integer = 1
var b Integer = 1
sum := a.Add(b)
fmt.Println(sum)
var i interface{} = a
sum = i.(Integer) // 报错
sum = sum.Add(b)//使用变量去接收这个值
fmt.Println(sum)//然后再进行调用绑定到地址的方法。
}
type Integer int
func (a *Integer) Add(b Integer) Integer {
return *a + b
}