【golang基础】go语言中的方法和interface的实现

前端之家收集整理的这篇文章主要介绍了【golang基础】go语言中的方法和interface的实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我们先来看一道面试题:以下代码能编译过去吗?为什么?

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type People interface {
  8. Speak(string) string
  9. }
  10.  
  11. type Stduent struct{}
  12.  
  13. func (stu *Stduent) Speak(think string) (talk string) {
  14. if think == "bitch" {
  15. talk = "You are a good boy"
  16. } else {
  17. talk = "hi"
  18. }
  19. return
  20. }
  21.  
  22. func main() {
  23. var peo People = Stduent{}
  24. think := "bitch"
  25. fmt.Println(peo.Speak(think))
  26. }

答案是不能,提示Stduent does not implement People (Speak method has pointer receiver),修正方法是var peo People = &Stduent{},赋值为指针

在Go语言中,函数方法是不一样的,函数是没有接收者的,而方法是有接收者的,属于某个结构体。

接受者有两种:value receivers(按值传递),pointer receivers(按指针传递,可能改变传入的参数)

之前看到有地方解释道:pointer receivers的方法既能传值也能传指针,包含了value receivers的方法

这个理解是错误的。

从这道题来看不是这样的,value receivers和pointer receivers是有明确区分的,people interface是value receivers,而student实现了pointer receivers的speak方法,所以student没有实现peple。

事实上pointer receivers的方法只是将m.speak()自动转换为(&m).speak(),这点官方的go tour中就有提到,go编译器帮你省去了取地址的一步。

猜你在找的Go相关文章