go经典面试题:浅析接口 - Go语言中文社区

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{}

小结

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

两种规则

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

这里写图片描述
 上面的表格可以解读为:如果是值接收者,实体类型的值和指针都可以实现对应的接口;如果是指针接收者,那么只有类型的指针能够实现对应的接口。


二 , 以实体类型是值还是指针的角度看。
这里写图片描述

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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u010824081/article/details/78181518
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-08-27 17:56:40
  • 阅读 ( 1251 )
  • 分类:面试题

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢