首页 文章 Go语言基础 go经典面试题:浅析接口
0
0
0
16

go经典面试题:浅析接口

接口(interface)与反射(reflect) 接口 经典

一道面试题

借一道基础面试题来试着分析一下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经典面试题:浅析接口”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持Go语言编程网!

相关文章

创建博客

开始创作
写作能提升自己能力,也能为他人分享知识。

在线教程

查看更多
  • Go入门指南

    Go入门指南

  • Go语言高级编程

    Go语言高级编程

  • Go Web 编程

    Go Web 编程

  • GO专家编程

    GO专家编程

  • Go语言四十二章经

    Go语言四十二章经

  • 数据结构和算法(Golang实现)

    数据结构和算法(Golang实现)

Go语言编程网

微信扫码关注订阅号


博客 资讯 教程 我的