繁体   English   中英

Go generics 中某个类型的解引用运算符是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM