分享
  1. 首页
  2. 文章

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

wind5o · · 2856 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

package main
import (
 "fmt"
)
type People interface {
 Speak(string) string
}
type Stduent struct{}
func (stu *Stduent) Speak(think string) (talk string) {
 if think == "bitch" {
 talk = "You are a good boy"
 } else {
 talk = "hi"
 }
 return
}
func main() {
 var peo People = Stduent{}
 think := "bitch"
 fmt.Println(peo.Speak(think))
}

答案是不能,提示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编译器帮你省去了取地址的一步。


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:wind5o

查看原文:【golang基础】go语言中的方法和interface的实现

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2856 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏