gpt4 book ai didi

reflection - 使用可嵌入结构的通用函数

转载 作者:数据小太阳 更新时间:2023-10-29 03:17:41 24 4
gpt4 key购买 nike

我正在尝试编写一个函数来处理特定类型的对象并调用作为参数之一传递的特定方法。由于没有继承或泛型,我使用的是嵌入。 (我不能使用接口(interface),因为您只能在其中定义方法,而且我还需要结构字段)。

我是 Go 的新手,所以我肯定做错了什么。这是我的代码的简化版本:

http://play.golang.org/p/r0mtDXtmWc

package main

import "fmt"
import "reflect"

type Animal struct {
Type string
}

type Dog struct {
Animal
}

type Cat struct {
Animal
}

func (d *Dog) SayWoof() {
fmt.Println("WOOF")
}

func (c *Cat) SayMeouw() {
fmt.Println("MEOUW")
}

func CallMethod(animal interface{}, baseAnimal *Animal, methodName string) {
fmt.Println("Animal type: ", baseAnimal.Type)

method := reflect.ValueOf(animal).MethodByName(methodName)
if !method.IsValid() {
return
}

method.Call([]reflect.Value{})
}

func main() {
dog := &Dog{}
dog.Type = "Dog" // for some reason dog := &Dog{Type: "Dog"} doesn't compile

cat := &Cat{}
cat.Type = "Cat"

CallMethod(dog, &dog.Animal, "SayWoof")
CallMethod(cat, &cat.Animal, "SayMeouw")
}

输出:

Animal type:  Dog
WOOF
Animal type: Cat
MEOUW

这段代码有效,但我基本上需要传递一个对象两次:首先是一个动态调用方法的接口(interface),然后是嵌入(“父”)对象以访问其字段。

我宁愿有类似的东西

func CallMethod(animal Animal, methodName string)

但是如果将 Dog 对象转换为 Animal,如下所示:

CallMethod(dog.Animal, "SayWoof")

它显然不会工作,因为在 Animal 中没有定义“SayWoof”方法。

所以问题是:有没有一种方法可以将子对象传递给函数一次并访问其所有反射数据?

谢谢

最佳答案

package main

import "fmt"

type Animal interface {
Speak()
}

type Dog struct {
}

type Cat struct {
}

func (d *Dog) Speak() {
fmt.Println("Woof")
}

func (c *Cat) Speak() {
fmt.Println("Meow")
}

func Speaketh(a Animal) {
a.Speak()
}

func main() {
dog := Dog{}
cat := Cat{}
Speaketh(&dog)
Speaketh(&cat)
}

无论如何,您如何期望具有泛型的语言能够解决您的问题?这是一个诚实的问题。对于不同的函数名称,您想调用“SayMeow”和“SayWoof”,没有类型不可知的数据结构可以帮助您神奇地调用正确的东西。

关于reflection - 使用可嵌入结构的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22009081/

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