嵌套泛型类型:重用函数的 Type 参数

给定以下定义:


type Collector[T, C any] interface {

    Collect(T, C) C

}


type mapCollector[K comparable, V any] struct {

    GetKey func(result V) K

}


func (m *mapCollector[K, V]) Collect(value V, c *sync.Map) *sync.Map {

    c.Store(m.GetKey(value), value)

    return c

}

我正在尝试为mapCollector. 这不起作用


func MakeUserMapCollector[K UserId, V User]() *mapCollector[K, V] {

    c := mapCollector[K, V]{

        GetKey: func(user V) K {

            return user.getId()

        }

    }

    return &c

}

相反,我必须重复


func MakeUserMapCollector() *mapCollector[UserId, User] {

    c := mapCollector[UserId, User]{

        GetKey: func(user User) UserId {

            return user.getId()

        }

    }

}

有没有办法重用MakeUserMapCollector类型参数在函数中声明类型?


qq_遁去的一_1
浏览 105回答 1
1回答

慕斯王

您可以创建一个通用构造函数,它接受一个用于“集合”的函数,然后将其传递给您的mapCollector结构。这看起来像这样:func MakeUserMapCollector[K comparable, V any](collect func(result V) K) *mapCollector[K, V] {    return &mapCollector[K, V]{        GetKey: collect,    }}然后你可以用你的类型作为类型参数和你的“集合”函数调用构造函数:mc := MakeUserMapCollector[UserId, User](func(result User) UserId { return result.GetId() })完整示例(Go Playground):package mainimport (    "fmt")type mapCollector[K comparable, V any] struct {    GetKey func(result V) K}func (m mapCollector[K, V]) Collect(result V) K {    return m.GetKey(result)}type UserId stringtype User struct {    Id UserId}func (u User) GetId() UserId {    return u.Id}func MakeUserMapCollector[K comparable, V any](collect func(result V) K) *mapCollector[K, V] {    return &mapCollector[K, V]{        GetKey: collect,    }}func main() {    u := User{        Id: "12",    }    mc := MakeUserMapCollector[UserId, User](func(result User) UserId { return result.GetId() })    fmt.Println(mc.Collect(u))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go