go经典面试题:浅析接口

一道面试题

借一道基础面试题来试着分析一下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{}

小结

我们都知道,如果要实现一个接口,必须实现这个接口提供的所有方法,但是实现方法的时候,我们可以使用指针接收者实现,也可以使用值接收者实现,这两者是有区别的,我们就好好理解下这两者的区别。

两种规则

一 , 以方法接收者是值还是指针的角度看。

go经典面试题:浅析接口_第1张图片
 上面的表格可以解读为:如果是值接收者,实体类型的值和指针都可以实现对应的接口;如果是指针接收者,那么只有类型的指针能够实现对应的接口。


二 , 以实体类型是值还是指针的角度看。
go经典面试题:浅析接口_第2张图片

 上面的表格可以解读为:类型的值只能实现值接收者的接口;指向类型的指针,既可以实现值接收者的接口,也可以实现指针接收者的接口。

你可能感兴趣的:(golang)