为了账号安全,请及时绑定邮箱和手机立即绑定

Go 1.18 Generics 如何使用接口定义一个新的类型参数

Go 1.18 Generics 如何使用接口定义一个新的类型参数

慕容3067478 2022-11-23 10:21:54

这曾经在 go1.18beta1 中有效,但在 go1.18rc1 中无效


package main


type A struct{}


func (*A) Hello() {

    println("Hello")

}


func Create[M any, PT interface {

    Hello()

    *M

}](n int) (out []*M) {

    for i := 0; i < n; i++ {

        v := PT(new(M))

        v.Hello()

        out = append(out, v)

    }

    return

}


func main() {

    println(Create[A](2))

}

执行会抛出


./prog.go:16:21: cannot use v (variable of type PT constrained by interface{Hello(); *M}) as type *M in argument to append:

    PT does not implement *M (type *M is pointer to interface, not interface)

似乎是由于这个限制:


不允许将类型参数或指向类型参数的指针作为结构类型中的未命名字段嵌入。同样,不允许在接口类型中嵌入类型参数。目前尚不清楚这些是否会被允许。


我如何在 go1.18rc1 中执行此操作?


查看完整描述

1 回答

?
慕的地6264312

TA贡献1564条经验 获得超6个赞

您必须再次转换v*M

out = append(out, (*M)(v))

你得到的错误是关于可分配性的。实际上,您问题中的引号并不禁止在接口中嵌入指针类型M和都是PT不同的命名类型参数,您不能在没有显式转换的情况下将一个分配给另一个。

相反,转换是有效的,因为PT的类型集中的所有类型(仅*M)都可转换为*M



查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信