【golang基础】go语言中的方法和interface的实现
我们先来看一道面试题:以下代码能编译过去吗?为什么?
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编译器帮你省去了取地址的一步。
到此这篇关于“【golang基础】go语言中的方法和interface的实现”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!您可能感兴趣的文章:
想系统学习GO语言(Golang
Go核心编程-面向对象 [OOP]
基于类型系统的面向对象编程语言Go
golang 面试题(十三)interface内部结构和nil详解
go 获取函数地址_Go语言基础--接口浅析
Golang接口 interface 和结构体struct
Go语言发展历史、核心、特性及学习路线
golang 接口_Golang之接口
GO语言零基础从入门到精通视频教程
浅析Go语言的Interface机制