go知识点

本文讨论了Go语言中接口与结构体方法的使用。代码示例展示了如何定义接口及其实现,特别是指针与值类型的差异。在给定的代码中,由于Student结构体未通过指针实现接口People的方法,导致编译失败。解决方案是将变量声明为接口的指针类型,并在方法定义中使用值类型。这个主题对于理解和优化Go代码的接口使用至关重要。
摘要由CSDN通过智能技术生成

以下代码能编译过去吗?为什么?

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))
}

在线运行

答: 编译失败,值类型 Student{} 未实现接口People的方法,不能定义为 People类型。

解析

考题中的 func (stu *Stduent) Speak(think string) (talk string) 是表示结构类型*Student的指针有提供该方法,但该方法并不属于结构类型Student的方法。因为struct是值类型。

修改方法:

  • 定义为指针 go var peo People = &Stduent{}
  • 方法定义在值类型上,指针类型本身是包含值类型的方法。 go func (stu Stduent) Speak(think string) (talk string) { //... }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值