Golang中如何解决play.golang.org链接的代码问题

Golang中如何解决play.golang.org链接的代码问题 代码中的注释已经解释了很多内容。

我正在尝试创建一个返回动物类型的函数,并将该函数作为参数传递。这里似乎存在类型转换的问题。

三个发送函数正在向我传递所需的信息。

代码示例链接

4 回复

是的,但我试图返回的是 Animalizer 接口,而不是字符串……这能实现吗?

更多关于Golang中如何解决play.golang.org链接的代码问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,只需从 a.(Animal1).typeOfAnimal() 中移除 typeOfAnimal() 方法。

a.(Animal1)

我对你的代码做了一些修改:https://play.golang.org/p/uiQuC0LBtit

你的类型转换其实没有问题。问题在于你的函数期望返回Animalizer类型,但你已经调用了typeOfAnimal()方法,这个方法返回的是string类型。

	//尝试创建一个函数,从第一个结构体获取动物类型。稍后会添加其他功能
	//错误来自这里。不确定如何返回typeOfAnimal
	a1 := func() Animalizer {
		var a Animalizer
		switch a.(type) {
		case Animal1:
			return a.(Animal1).typeOfAnimal()
		}
	}

在您提供的代码中,主要问题在于类型转换和接口使用。具体来说,sendDogsendCatsendBird 函数返回的是具体类型(DogCatBird),但 getAnimal 函数期望接收一个返回 Animal 接口的函数作为参数。由于这些具体类型没有显式实现 Animal 接口,导致类型不匹配。以下是修复后的代码示例,通过让具体类型实现 Animal 接口来解决问题:

package main

import "fmt"

// Animal 接口定义了所有动物类型必须实现的方法
type Animal interface {
    Speak() string
}

// Dog 类型实现 Animal 接口
type Dog struct{}

func (d Dog) Speak() string {
    return "Woof!"
}

// Cat 类型实现 Animal 接口
type Cat struct{}

func (c Cat) Speak() string {
    return "Meow!"
}

// Bird 类型实现 Animal 接口
type Bird struct{}

func (b Bird) Speak() string {
    return "Tweet!"
}

// sendDog 返回一个 Dog 实例,它实现了 Animal 接口
func sendDog() Animal {
    return Dog{}
}

// sendCat 返回一个 Cat 实例,它实现了 Animal 接口
func sendCat() Animal {
    return Cat{}
}

// sendBird 返回一个 Bird 实例,它实现了 Animal 接口
func sendBird() Animal {
    return Bird{}
}

// getAnimal 接收一个返回 Animal 的函数,并调用它来获取动物实例
func getAnimal(sendFunc func() Animal) Animal {
    return sendFunc()
}

func main() {
    // 测试 getAnimal 函数,传递不同的发送函数
    dog := getAnimal(sendDog)
    fmt.Println("Dog says:", dog.Speak())

    cat := getAnimal(sendCat)
    fmt.Println("Cat says:", cat.Speak())

    bird := getAnimal(sendBird)
    fmt.Println("Bird says:", bird.Speak())
}

关键修改点:

  • DogCatBird 类型实现 Animal 接口,通过定义 Speak() string 方法。
  • 修改 sendDogsendCatsendBird 函数,使它们返回 Animal 接口类型,而不是具体类型。这允许这些函数与 getAnimal 的参数类型匹配。
  • main 函数中,调用 getAnimal 并传递相应的函数,然后通过接口调用 Speak 方法。

运行此代码将输出:

Dog says: Woof!
Cat says: Meow!
Bird says: Tweet!

这个修复确保了类型一致性,避免了原始代码中的转换错误。

回到顶部