【问题标题】:Generic Structs with GoGo的通用结构[重复]
【发布时间】:2021-06-28 16:01:33
【问题描述】:

这个 C# 代码在 Go 中的等价物是什么,我该如何构建它

    class ModelX<T>
    {
        public T Data { get; set; }
    }

    ModelX<int>

我尝试过类似的方法:

    type ModelX<T> struct {
        ModelY
        Data []T
    }

    m := ModelX<T>

如何做到这一点?这可能吗?

【问题讨论】:

    标签: go generics


    【解决方案1】:

    从 Go 1.18(很快)开始,你可以定义generic types

    type ModelX[T any] struct {
        Data []T
    }
    

    使用时泛型类型必须是instantiated,实例化需要类型参数列表:

    func main() {
        // passing int as type parameter
        modelInt := ModelX[int]{Data: []int{1, 2, 3}}
        fmt.Println(modelInt.Data) // [1 2 3]
    }
    

    一个重要的细节是——与函数1不同——泛型类型在实例化时不能完全省略类型参数。然而:

    如果列表是部分的,则所有剩余的类型参数都必须是可推断的。

    因此,您可以传递部分列表,前提是所有缺失的类型都可以从显式提供的类型中推断出来。例如:

    type Foo[T any, PT *T] struct {
        val T
        ptr PT
    }
    

    只能用第一种类型来实例化,因为第二种可以从第一种推断出来:

    func main() {
        v := int64(20)
        foo := Foo[int64]{val:v, ptr: &v}
    
        fmt.Println(foo)
    }
    

    GoTip 游乐场:https://gotipplay.golang.org/p/pV0xPCewUdB


    1:规范中的引用是 “对参数化函数的调用可以提供(可能是部分的)类型参数列表,或者如果省略的类型参数可以从普通(非-type) 函数参数。”。此引用不包括参数化类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多