Golang中是否可以通过go2go嵌入泛型结构体?

Golang中是否可以通过go2go嵌入泛型结构体? 我想知道是否可能使用组合并嵌入一个泛型结构体(当然是在 go2go 中)?

我想做类似这样的事情:

type A[T any] struct {
    a T
}

func (a A[T]) F() T {
    return a.a
}

type B[T any] struct {
    A[T]
}

func main() {
    b := B[string]{A[string]{"Hello"}}
    fmt.Println(b.F())
}

我收到了这个错误信息,它指的是主函数中对 “Println” 的调用:“b 的类型 B[string] 与 A[T] 不匹配(无法推断 T)”

一个非泛型版本可能是这样的(可以正常工作并打印 “Hello”):

type A struct {
    a string
}

func (a A) F() string {
    return a.a
}

type B struct {
    A
}

func main() {
    b := B{A{"Hello"}}
    fmt.Println(b.F())
}

我对 Go 中这个新的泛型特性不太熟悉,所以可能是我做错了?还是说这根本不可能?

谢谢!


更多关于Golang中是否可以通过go2go嵌入泛型结构体?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中是否可以通过go2go嵌入泛型结构体?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在 Go 2 泛型设计中,嵌入泛型结构体是支持的,但你的代码需要稍作调整。问题在于泛型类型推断的细节。

以下是修正后的代码:

package main

import "fmt"

type A[T any] struct {
    a T
}

func (a A[T]) F() T {
    return a.a
}

type B[T any] struct {
    A[T]  // 正确嵌入泛型结构体
}

func main() {
    // 明确指定泛型参数,避免类型推断问题
    b := B[string]{
        A[string]{a: "Hello"},  // 明确指定字段名和类型
    }
    
    // 或者使用更简洁的写法
    b2 := B[string]{A[string]{"Hello"}}
    
    fmt.Println(b.F())   // 输出: Hello
    fmt.Println(b2.F())  // 输出: Hello
}

关键点:

  1. 嵌入语法 A[T] 是正确的
  2. 初始化时需要明确指定泛型参数类型 B[string]A[string]
  3. 编译器需要明确的类型信息来实例化泛型

另一种更简洁的写法是使用类型推断:

func NewB[T any](a A[T]) B[T] {
    return B[T]{A: a}
}

func main() {
    a := A[string]{a: "Hello"}
    b := NewB(a)
    fmt.Println(b.F())  // 输出: Hello
}

或者直接在初始化时:

func main() {
    b := B[string]{A: A[string]{a: "Hello"}}
    fmt.Println(b.F())  // 输出: Hello
}

你的原始代码错误是因为编译器在初始化时无法正确推断嵌套的泛型类型参数。通过明确指定类型参数,问题就解决了。

回到顶部