社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
借一道基础面试题来试着分析一下go的接口
以下代码能编译通过么?
package main
import "fmt"
type People interface {
Speak(string) string
}
type Student struct {}
func (stu *Student)Speak(think string)(talk string) {
if think == "Excellent"{
talk = "Nice"
} else {
talk = "Hi"
}
return
}
func main() {
var p People = Student{}
think := "Excellent"
fmt.Println(p.Speak(think))
}
答案是不能通过的,为什么么?
看编译信息:
go:20:6: cannot use Student literal (type Student) as type People in assignment:
Student does not implement People (Speak method has pointer receiver)
简而言之,Student没有实现People接口.
那么正确的打开方式是怎样的呢?
要想正常编译,可以这么做:
两种方案:
一: func (stu *Student)Speak(think string)(talk string){}
main函数中 : var p People = &Student{}二:func (stu Student)Speak(think string)(talk string)
main函数中var p People = Student{} 或 var p People = &Student{}
我们都知道,如果要实现一个接口,必须实现这个接口提供的所有方法,但是实现方法的时候,我们可以使用指针接收者实现,也可以使用值接收者实现,这两者是有区别的,我们就好好理解下这两者的区别。
一 , 以方法接收者是值还是指针的角度看。
上面的表格可以解读为:如果是值接收者,实体类型的值和指针都可以实现对应的接口;如果是指针接收者,那么只有类型的指针能够实现对应的接口。
二 , 以实体类型是值还是指针的角度看。
上面的表格可以解读为:类型的值只能实现值接收者的接口;指向类型的指针,既可以实现值接收者的接口,也可以实现指针接收者的接口。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!