我试图在Golang中实现一些缓存函数,但我希望它们对实现Stringer接口的字符串和其他对象都有效.我正在try 使用Golang泛型,到目前为止我已经做到了:

import (
    "fmt"
)

type String interface {
    ~string | fmt.Stringer
}

然而,这给出了一个错误cannot use fmt.Stringer in union (fmt.Stringer contains methods).有没有一种方法可以做到这一点而不依赖于反射或类型装箱/拆箱?

推荐答案

泛型——理论上允许使用多种类型——在compilation个时间点上确定为一种具体类型.runtime接口允许多种类型.您希望同时将这两者结合起来——不幸的是,这是不可能的.


在不使用反射的情况下,最接近的方法是使用运行时类型断言:

func StringLike(v any) string {

    if s, ok := v.(string); ok {
        return s
    }

    if s, ok := v.(fmt.Stringer); ok {
        return s.String()
    }

    panic("non string invalid type")
}

https://go.dev/play/p/p4QHuT6R8yO

Go相关问答推荐

使用Gorm创建自定义连接表

在保留额外参数的同时解封YAML

GetSecretValue,get identity:get credentials:无法刷新缓存的凭据

一种基于时间的Golang函数节制器

在不耗尽资源的情况下处理S3文件下载

如何防止程序B存档/删除围棋中程序A当前打开的文件?

如何使用中间件更改http请求的响应代码?

如何解析Go-Gin多部分请求中的 struct 切片

如何在 zap 记录器库中使用自定义时间函数

如何在golang中使用viper获取对象的配置数组?

Go Programming Language书上的例子server2错了吗?

我突然无法再将我的 GoLang 应用程序部署到 Google AppEngine

Golang 中的泛型类型转换

如何将整数哈希细分为范围

在 Go 模板中对照片使用随机 Int

如何在 Docker 容器中使用私有存储库进行身份验证

如何使用 Status 字段创建 Kubernetes 对象?

转到文本/模板模板:如何根据模板本身的值数组判断值?

为什么 go.mod 中的所有依赖都是间接的?

Golang API 的 HTTPS