假设我有一个名为foo的通用struct:

type foo[T any] struct {
    data T
}

我有一个变量函数,我想传递给它一些foo.它们可能是任何类型的foo.我的理解是,因为foo[int]不同于foo[string],所以我需要将省略号定义为any类型,如下所示:

func bar(things ...any) {
    for _, v := range things {
        fmt.Println(v)
    }
}

这确实奏效了.

func main() {
    a := foo[string]{"cheese"}
    b := foo[int]{42}

    bar(a, b)
}

我的问题是,我想专门访问每个foo中的data字段.但如果我这样定义bar

func bar(things ...any) {
    for _, v := range things {
        fmt.Println(v.data)
    }
}

编译器感到不安是可以理解的,因为things可能是anything,因此不能保证他们有字段data.

会有一个名为data的字段,因为我总是会通过foo,但我不能指定我只会通过foo,就像这样,

func bar(things ...foo) {
    for _, v := range things {
        fmt.Println(v.data)
    }
}

因为没有指定foo的类型.


如何将未指定数量的foo传递给bar,然后访问data字段?

推荐答案

一种解决方案似乎是使用反射并使用FieldByName访问该字段:

func bar(things ...any) {
    for _, v := range things {
        x := reflect.ValueOf(v)
        fmt.Println(x.FieldByName("data"))
    }
}

不过,我不清楚这是否会因为某种原因而被认为是一种障碍和/或危险.大概,我需要在那里进行一些判断,以确保things中的所有内容都是某种类型的foo,否则我可能会试图访问一个不存在的字段.

Go相关问答推荐

../golang/pkg/mod/github.com/wmentor/lemmas@v0.0.6/processor.go:72:9:未定义:令牌.进程

如何在GoFr中为生产和本地环境设置不同的配置?

是不是有什么原因导致`Strings.EqualFold`不先进行长度比较?

GO框架Echo中间件的使用

什么东西逃到了堆里?

Go 中将 int 切片转换为自定义 int 切片指针类型的函数

启动套接字服务器会干扰 gRPC/http 客户端服务器通信 Golang

如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf struct ?

是否可以在调试期间在 VSCode 中预览 github.com/shopspring/decimal 值?

Wire google Inject with multi return from provider 函数

grpc-gateway:重定向与定义不匹配(原始文件)

如何编写一个以字符串或错误为参数的通用函数?

如何使用struct的方法清除除某些字段之外的struct值

使用 bolthold 3 条件进行 boltDB 查询

Go lang - 惯用的默认后备

如何在眼镜蛇(golang)中将标志作为参数传递?

传递上下文的最佳方式

(如何)我可以基于接口抽象地实现Stringer吗?

如何解决在mac m1中运行gcc失败退出状态1?

如何动态解析 Go Fiber 中的请求正文?