登录
首页 >  Golang >  Go问答

如何编写一个约束来限制特定类型?

来源:stackoverflow

时间:2024-03-21 17:06:38 240浏览 收藏

在 Go 语言中,无法使用约束类型集合来限制特定类型。尽管可以通过定义无法满足的约束(例如要求类型同时为 int 和具有方法 foo()),但无法定义“any-minus-int”或“any-plus-notsatisfiable”这样的约束。

问题内容

type nonstring interface {
    // ???
}

func myfunc[t nonstring](v t) t {
    return v
}

func main() {
    myfunc(1)          // ok
    myfunc(false)      // ok
    myfunc([]string{}) // ok

    myfunc("hi, boy!") // i hope a comiler error occurs here!  
}

上面代码的注释中描述了我想要的内容。

在golang中可以吗?

原始场景

我有两个功能,如下:

func Any2String(v any) string {        
    return fmt.Sprint(v) // Slow version
}

func Integer2String[N Integer](v N) string {
    return strconv.FormatInt(int64(v), 10) // Fast version
}

any2string(v) 可以将任何 v 转换为字符串。但是,如果 v 是一个整数,则 integer2string(v) 速度要快得多。

因此,当更快的 integer2string(v) 适用时,我希望编译器阻止我调用 any2string(v)


正确答案


不,这是不可能的。约束类型集合不能表示为集合减法。

可以定义任何类型都无法满足的约束,例如:

type notsatisfiable interface {
    int
    foo()
}

此约束要求类型完全为 int 并且具有方法 foo()。由于您无法在预先声明的类型上定义方法,因此不可能满足此约束。

但是,您不能定义像“any-minus-int”或“any-plus-notsatisfiable”这样的约束。

如果您的函数对于除离散数量类型之外的任何类型都完全相同,则只需使用类型开关:

func ToString(v any) string {
    switch t := v.(type) {
    case int:
        return Integer2String(t)
    default:
        return Any2String(t)
    }
}

您甚至不需要泛型,因为 any 类型的常规参数就可以正常工作。

以上就是《如何编写一个约束来限制特定类型?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>