[英]What is the dereference operator of a type in Go generics?
在执行 generics 时,可以从任何类型创建指针类型,请参阅类型参数建议中的指针方法示例部分。 例子:
type Pointer[T any] interface {
*T // non-interface type constraint element
// ... more constraints ...
}
如何做相反的事情,声明一个类型的取消引用? 就像是:
type Deref[T any] interface {
???T // If T=="*int", this would refer to "int"
...
}
谢谢!
您只能取消引用指针vaues ,但不能取消引用类型。 *T
不是取消引用T
类型, *T
是一个类型字面量,构成一个指针类型,其基本类型将为T
。
编译器只允许对受约束类型上允许的类型参数值进行操作。
使用any
,所有类型都将被允许,即使是非指针类型,其值也不能被取消引用。
要取消引用一个值,它必须是一个指针。 一种方法是将参数指定为*T
类型,如下例所示:
func deref[T any](p *T) T {
return *p
}
T
可以是任何类型,但*T
肯定是指针类型,其值可以被取消引用。 测试它:
p := &image.Point{1, 2}
x := deref(p)
log.Printf("%T %v\n", x, x)
p := new(int)
*p = 3
x := deref(p)
log.Printf("%T %v\n", x, x)
Output 将是:
2009/11/10 23:00:00 image.Point (1,2)
2009/11/10 23:00:00 int 3
另一种选择是使用仅允许指针类型的约束,例如仅*int
:
func deref2[T interface{ *int }](p T) {
log.Printf("%T %v\n", *p, *p)
}
测试它:
p := new(int)
*p = 4
deref2(p)
Output:
2009/11/10 23:00:00 int 4
虽然在这里使用 generics 没有用,但您可以将T
替换为*int
,无需类型参数。
尝试Go Playground上的示例。
没有“类型的取消引用”这样的事情。
指针类型是复合类型,即您需要一个基本类型开始。 你不能反过来 go。
如果要在约束中强制使用非指针类型,请指定非指针类型:
// will disallow *int
type NonPointerInt interface {
~int
}
然而,这不适用于任何T
。 使用any
约束,您都可以传递诸如int
(基本类型)本身或***int
(指向指向...的指针的指针)之类的类型,然后这种假设的“类型取消引用”将具有不明确的含义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.