gpt4 book ai didi

go - 当类型具有处理函数时如何嵌入类型?

转载 作者:IT王子 更新时间:2023-10-29 01:47:54 24 4
gpt4 key购买 nike

我正在使用一个库,该库实现了一种接受处理程序并在需要时为您调用它们的类型。我想创建一个嵌入类型并具有超出嵌入类型功能的属性的父类(super class)型。我希望能够在处理程序中使用这些属性。

使用我的类型作为参数无法通过类型检查,在处理程序声明中使用基类型是可行的,但我无法访问新字段。我是新来的,很想知道如何做到这一点,或者在更改库以启用时有什么建议(接口(interface)而不是处理程序声明?)...

人为的例子:

    package main

type Animal struct {
Color string
feeders map[string]feeder
}
type feeder func(*Animal, string) string

func (a *Animal) addFeeder(name string, fn feeder) {
a.feeders[name] = fn
}

type mamal struct {
Animal
hair string
}

func feedHuman(m *mamal, food string) string {
return "you got " + m.Color + " " + m.hair + " hair in your " + food
}

func main() {
a := mamal{Animal{Color: "red"}, "bushy"}
a.addFeeder("man", feedHuman)
// fails to compile feedHuman needs to take *Animal but then cant access hair"
}

最佳答案

你是对的,你不能那样做,因为哺乳动物不是动物。 go 中没有继承,所以这不是解决方案。但是您可以使用接口(interface)实现此行为。顺便说一句,你的代码不工作,因为你没有初始化feeders map,所以你编译后会遇到问题。

解决方案一:使用类型断言

package main

import "fmt"

type Animal struct {
Color string
feeders map[string]feeder
}
type feeder func(interface{}, string) string

func (a *Animal) addFeeder(name string, fn feeder) {
a.feeders[name] = fn
}

type mamal struct {
Animal
hair string
}

func feedHuman(i interface{}, food string) string {
m := i.(mamal)
return "you got " + m.Color + " " + m.hair + " hair in your " + food
}

func main() {
a := mamal{Animal{feeders: make(map[string]feeder), Color: "red"}, "bushy"}
a.addFeeder("man", feedHuman)
fmt.Println(a.feeders["man"](a, "pineapple"))
// => you got red bushy hair in your pineapple
}

这有点危险,因为如果你经过的界面不是哺乳动物,它就会 panic。

第二种解决方案:使用 Feeder 接口(interface)

package main

import "fmt"

type Feeder interface {
Feed(string) string
}

type Animal struct {
Color string
feeders map[string]Feeder
}

func (a *Animal) addFeeder(name string, feeder Feeder) {
a.feeders[name] = feeder
}

type mamal struct {
Animal
hair string
}

func (m *mamal) Feed(food string) string {
return "you got " + m.Color + " " + m.hair + " hair in your " + food
}

func main() {
a := &mamal{Animal{Color: "red", feeders: make(map[string]Feeder)}, "bushy"}
a.addFeeder("man", a)
fmt.Println(a.feeders["man"].Feed("pineapple"))
// you got red bushy hair in your pineapple
}

虽然它工作得很好,但它将处理程序的数量限制为一个,所以我认为这不是您想要的。

关于go - 当类型具有处理函数时如何嵌入类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37285439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com