博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【golang基础】go语言中的方法和interface的实现
阅读量:6699 次
发布时间:2019-06-25

本文共 919 字,大约阅读时间需要 3 分钟。

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

package mainimport (    "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编译器帮你省去了取地址的一步。

转载地址:http://jamoo.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
利用HTML中的XML数据岛记录浏览
查看>>
resource fork, Finder information, or similar detr
查看>>
unicode字符、python乱码问题
查看>>
持久代是方法区还是堆中的?
查看>>
北邮-上机-提交错误解决及一些经验
查看>>
Android的按钮单击事件及监听器的实现方式
查看>>
在Spring中使用JTA事务管理
查看>>
【运动快乐】享受赤脚慢跑 收获健康快乐
查看>>
PopStar(消灭星星)游戏源代码下载、分析及跨平台移植---第四篇(关卡)
查看>>
MySQL锁的用法之行级锁
查看>>
ORACLE sqlplus设置行数和宽度
查看>>
舟桥test
查看>>
Linux 高可用(HA)集群之keepalived
查看>>
社交系统ThinkSNS-plus(TS+)V1.0发布!
查看>>
填问卷,得《2015中国呼叫中心知识库现状与问题报告》
查看>>
mysql从入门到精通之数据库基本概念理解
查看>>
EF部署
查看>>
iOS开发篇——OC 协议和代理设计模式介绍
查看>>
Apple System: Error: ENFILE: file table overflow
查看>>