type People interface {
Speak(string) string
}
type Student struct{}
func (stu *Student) Speak(think string) (talk string) {
if think == "speak" {
talk = "speak"
} else {
talk = "hi"
}
return
}
func main() {
var peo People = Student{}
think := "speak"
fmt.Println(peo.Speak(think))
}
上面的代码会有语法异常“cannot use Student literal (type Student) as type People in assignment:
Student does not implement People (Speak method has pointer receiver”
如果要编译通过,有两种方式修改`
type People interface {
Speak(string) string
}
type Student struct{}
func (stu Student) Speak(think string) (talk string) {
if think == "speak" {
talk = "speak"
} else {
talk = "hi"
}
return
}
func main() {
var peo People = Student{}
think := "speak"
fmt.Println(peo.Speak(think))
}
或者
type People interface {
Speak(string) string
}
type Student struct{}
func (stu *Student) Speak(think string) (talk string) {
if think == "speak" {
talk = "speak"
} else {
talk = "hi"
}
return
}
func main() {
var peo People = &Student{}
think := "speak"
fmt.Println(peo.Speak(think))
}
由此可以得出一个结论,在interface的视角中,指针与结构体是区分开来的;接口中指定的方法如果由结构体绑定;那么结构体的指针或者结构体都可以与接口绑定,如果接口中指定的方法被结构体的指针绑定,那么接口只能与该类型的指针绑定