登录
首页 >  Golang >  Go问答

在结构体方法中使用泛型变量

来源:stackoverflow

时间:2024-02-08 15:48:22 460浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《在结构体方法中使用泛型变量》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我有以下使用泛型的代码。我知道泛型不能与方法一起使用,但可以与类型一起使用。从技术上讲,我的代码符合这两个限制,但我仍然收到错误

./main.go:12:9:无法在没有实例化的情况下使用泛型类型 genericcachewrapper[tany]

实例化位于main函数的第一行。 有什么办法可以实现这一点吗?这可以被视为 golang 错误吗?

import (
    "encoding/json"
    "fmt"
)

type GenericCacheWrapper[T any] struct {
    Container T
}

func (c GenericCacheWrapper) MarshalBinary() (data []byte, err error) {
    return json.Marshal(c.Container)
}

func (c GenericCacheWrapper) UnmarshalBinary(data []byte) error {
    return json.Unmarshal(data, &c.Container)
}

func main() {
    wrapper := GenericCacheWrapper[int]{Container: 4}
    data, err := wrapper.MarshalBinary()
    if err != nil {
        panic(err)
    }

    fmt.Println(data)
}

https://go.dev/play/p/9swxxymacuh


正确答案


如果您想明确表示您实际上并未在函数中使用 t,则只需将 [t] 添加到 genericcachewrapper[_] 的末尾即可。

package main

import (
    "encoding/json"
    "fmt"
)

type GenericCacheWrapper[T any] struct {
    Container T
}

func (c GenericCacheWrapper[T]) MarshalBinary() (data []byte, err error) {
    return json.Marshal(c.Container)
}

func (c GenericCacheWrapper[T]) UnmarshalBinary(data []byte) error {
    return json.Unmarshal(data, &c.Container)
}

func main() {
    wrapper := GenericCacheWrapper[int]{Container: 4}
    data, err := wrapper.MarshalBinary()
    if err != nil {
        panic(err)
    }

    fmt.Println(data)
}

此规则在 language spec 中定义:

泛型类型也可能有与其关联的方法。在这种情况下,方法接收者必须声明与泛型类型定义中存在的相同数量的类型参数。

但这背后的原因还不是很清楚,也许是为了使编译器/类型检查的实现更容易。

相关:Go error: cannot use generic type without instantiation

终于介绍完啦!小伙伴们,这篇关于《在结构体方法中使用泛型变量》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>