給定以下定義:
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型別引數在函式中宣告型別?
uj5u.com熱心網友回復:
您可以創建一個通用建構式,該函式接受“集合”函式,然后將其傳遞給您的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 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://www.uj5u.com/qiye/515155.html
標籤:去模板
