最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 是否可以编写一个约束来排除某种类型?

    是否可以编写一个约束来排除某种类型?

    php小编草莓给您带来了一篇关于编写约束来排除某种类型的文章。在PHP中,我们可以使用类型约束来限制函数或方法的参数类型,但是否可以编写一个约束来排除某种类型呢?答案是肯定的。通过使用“!”操作符,我们可以在类型约束中排除某种类型,从而实现更精确的参数类型限制。在本文中,我们将详细介绍如何使用“!”操作符来排除某种类型,并给出实际的代码示例。让我们一起来探索这个有趣的话题吧!

    问题内容

    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 类型的常规参数就可以正常工作。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 是否可以编写一个约束来排除某种类型?
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 292稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情