鉴于以下定义:
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编写一个模板化的make函数。这不管用
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类型参数来声明函数中的类型?
发布于 2022-09-27 00:05:31
您可以创建一个通用构造函数,该函数接受用于“集合”的函数,然后将其传递给您的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() })完整示例(围棋游乐场):
package main
import (
"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 string
type 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))
}https://stackoverflow.com/questions/73858175
复制相似问题